2017-04-09 6 views
0

GHCiで複数行にわたって関数を定義しようとすると、私はHaskellを学び、これらの字下げエラーを受け続けます。ここでelem機能を再定義しようとする試みです:GHCiでの字下げの問題

λ: :{ 
| let elem' x xs 
|  | null xs = False 
|  | x == head xs = True 
|  | otherwise = elem' x (tail xs) 
| :} 

<interactive>:15:5: error: 
    parse error (possibly incorrect indentation or mismatched brackets) 

=兆候は何とか整列する必要がありますか?

+0

少なくとも1つのスペースをさらにインデントする必要があります。そのため、同じレベルではなく、定義の「内側」にあります。 – Ryan

答えて

2

ガードをさらに押し込む必要があります。あなたはelem'名前と同じインデントでそれらを残す場合は、GHC(i)はlet - ブロック内の追加の定義としてではなく、elemの定義の一部としてそれらを解析しようとします。

let elem' x xs 
     | null xs = False 
     | x == head xs = True 
     | otherwise = elem' x (tail xs) 

あなたの場合GHC 8を使用している以上、あなたはGHCiの中で物事を定義するためのletを必要としないので、これは(以前と:{:}、間)だけで動作します:

elem' x xs 
    | null xs = False 
    | x == head xs = True 
    | otherwise = elem' x (tail xs) 
+0

ありがとう、ありがとう。これはghciでのコーディングをかなり面倒にするようです。これを少し簡単にするための手口やツールはありますか? – dsaxton

+0

@dsaxton 'let'を含むこれを含むインデント規則は、GHCiや他の場所でも同じです。 1つの選択肢は、明示的な中カッコとセミコロンを使用しています - 私はそれが実際に物事を改善するとは思わないが、プロンプトで1つのライナーとして比較的短いものを入力したい場合はたまに便利です。私がしばしばやることは、GHCiウィンドウ(または他の軽量エディタ)に複数行の定義を入力し、それらをGHCiの ':{'と ':}'の間に貼り付けることです。 (ガードを使用したい場合は、ガードを使用する場合、実際には改行はオプションです)。 – duplode

0

この

のようにインデント
let elem' x xs 
    | null xs = False 
    | x == head xs = True 
    | otherwise = elem' x (tail xs) 

はあなたではなく、新しいものを始めるよりも前のエントリを、継続したい場合は、あなたがより多くのそれをインデントする必要があり非常に

let x1 = ... 
    x2 = ... 
    x3 = ... 
    x4 = ... 

のような4つのエントリを持つletです。ルールはソースファイルとGHCiで同じです。インデントルールは最初は少し不思議そうですが、実際はfairly simpleです。