web-dev-qa-db-ja.com

GHCiの複数行コマンド

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を使用しています

117
R71

ほとんどの場合、型推論に依存して署名を作成できます。あなたの例では、次のもので十分です:

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との対話の詳細を確認できます。

161
Nicolas Wu

この問題を解決するには、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スペース分インデントする必要があります。

104
adrian

letを使用:

Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5
13

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
3
Aaron Hall