Ghciで複数行のコマンドを入力する際に問題があります。
次の2行のコードはファイルから機能します。
addTwo :: Int -> Int -> Int
addTwo x y = x + y
しかし、ghciで入力すると、エラーが発生します。
<interactive>:1:1: error:
Variable not in scope: addTwo :: Int -> Int -> Int
また、コードを:{ ... :}
内に配置しようとしましたが、この例では機能しません。これは、行を1行に追加するだけなので、そうではないからです。
WinGHCiバージョン2011.2.0.1を使用しています
ほとんどの場合、型推論に依存して署名を作成できます。あなたの例では、次のもので十分です:
Prelude> let addTwo x y = x + y
型シグネチャを持つ定義が本当に必要な場合、または定義が複数行にわたる場合は、ghciでこれを実行できます。
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 4 7
11
これを1行に絞り込めることにも注意してください。
Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
ドキュメントの プロンプトでの対話式評価 セクションで、ghciとの対話の詳細を確認できます。
この問題を解決するには、GHCIを起動して:set +m
:
Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude|
Prelude> addTwo 1 3
4
ブーム。
ここで何が起こっているのか(そして私は主にyouと話している、人はあなたのやり方を進めながら助けを求めてグーグルで話している Learn You A Haskell )GHCIは、関数名のバインディングをその場で変更するインタラクティブな環境です。関数定義をlet
ブロックでラップする必要があります。これにより、Haskellは何かを定義しようとしていることを認識します。 :set +m
stuffは、マルチライン:{
code:}
コンストラクト。
空白もブロック内で重要なので、let
の4つのスペースを考慮して、型定義の後に関数定義を4スペース分インデントする必要があります。
let
を使用:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5
GHCIバージョン8.0.1 以降、REPLで関数を定義するためにlet
は不要になりました。
したがって、これはあなたのためにうまくいくはずです:
λ: addTwo x y = x + y
λ: addTwo 1 2
3
λ: :t addTwo
addTwo :: Num a => a -> a -> a
Haskellの型推論は、フロートでも機能する一般化された型付けを提供します。
λ: addTwo 2.0 1.0
3.0
独自のタイピングを提供する必要がある場合、let
を複数行入力と組み合わせて使用する必要があるようです(:set +m
GHCIで複数行入力を有効にします):
λ: let addTwo :: Int -> Int -> Int
| addTwo x y = x + y
|
λ: addTwo 1 2
3
しかし、ポリモーフィックでないタイピングのため、Int
以外を渡すとエラーが発生します。
λ: addTwo 2.0 1.0
<interactive>:34:8: error:
• No instance for (Fractional Int) arising from the literal ‘2.0’
• In the first argument of ‘addTwo’, namely ‘2.0’
In the expression: addTwo 2.0 1.0
In an equation for ‘it’: it = addTwo 2.0 1.0