入力のHaskellエラー解析エラー `= '


111

私はHaskellを使い始めたばかりで、始めてから次のghciことを試しました。

f x = 2 * x

そして私は得ました:

<interactive>:1:4: parse error on input `='

わかりません。

不思議なことに、以前はうまく機能していました。私はHaskellの設定を誤ったと思います。ghc6を再インストールしても問題は解決しません。

詳細については、Ubuntu 10.4を使用しており、ghc6のバージョンは6.12.1-12です。

回答:


160

GHCi 7.x以前letでは、その中で物事を定義するためにが必要です。

Prelude> let f x = x * 2
Prelude> f 4
8

GHC 8.0.1以降、トップレベルのバインディングがGHCiサポートされているため、OPのコードは変更なしで機能します。

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8

15
ありがとう。「実世界のハスケル」(少なくとも私が持っているバージョン)にはlet、その例にはありません
Micah

43
「Learn you Haskell」はこれについてまったく触れていません。
Bakuriu 2013年

2
@Bakuriu LYAH 今言及していませlet。しかし、フォローアップ。でLYAH、私は読んでaddThree :: Int -> Int -> Int -> Int(改行) addThree x y z = x + y + zが、唯一の二番目の実行GHCiではlet。どうして?
同型写像

9
@Bakuriuはい、しかし著者はあなたの定義を外部ファイルに書き、それをGHCI内にロードするように指示します。GHCIに直接書き込むのではありません。そして、前者は完全に機能します。
superzamp 2014年

その場合、このチュートリアルは明らかに間違っています:seas.upenn.edu/~cis194/lectures/01-intro.html。それでも、HaskellのWebサイトで推奨される最初のチュートリアルです。
cammil

51

Haskellソースファイルに入力すると、

f x = 2 * x

正しい。

ghciに直接入力する場合letは、行の先頭に入力する必要があります。

let f x = 2 * x

12
GHCiで機能しないのはなぜですか?構文に違いがあるのはなぜですか?
2015

1
@Beat GHCiは構文解析ステートメントではなく、デフォルトで式を評価しようとしますが、ファイル形式は逆です。そのため、ステートメント(つまり、変数の設定、関数の定義など)を作成するには、を使用して実行していることを宣言する必要がありますlet。GHCiを1つの大きなlet ... in ...声明と考えてください。
AJFarmar 2017

20

ghciを使用するための良い目安は、入力するコードはすべてdo-blockセマンティクスに準拠する必要があるということです。つまり、構文上、IOモナド内でプログラミングしていると想定できます(これが新しい用語の場合でも、心配しないでください。このチュートリアルを一読することを強くお勧めします)。

この回答は、この点を例で示しており、IOとghciの性質についてのより実用的な洞察を提供する可能性があります。


26
この答えは初心者には役に立たない。彼は高度なトピックではなく、前進するためのシンプルで実用的なヒントを探しています。あなたは乗算表を学ぶ子供に多項式積を説明しません-それはあなたがどれだけ知っているかを示しません、それはあなたがあなたが知っていることを共有する方法がわからないことを示します。
btk 2013年

3
@btk:誰もがいつか初心者であることをやめなければなりません。昨日Haskellの学習を始めましたが、すぐにRaeezの言うことはすべて理解できると確信しています。
Vietnhi Phuvan 2014

10
今日がHaskellを学ぶ最初の日です。この答えは、なぜ私が使用しなければならないのかを理解するのに非常に役立ちましたlet。私は「wtf、なぜ使用しなければならないのか」のようでしたが、letこれを読んで啓発されました。
Brian Tingle 2014年

4

GHC 8.0.1以降、これはエラーを生成しなくなりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.