2017-04-09 57 views
0

我正在學習Haskell,並在嘗試通過GHCi中的多行定義函數時不斷收到這些縮進錯誤。下面就來重新定義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

你必須進一步縮進它至少一個空格,以便它在定義中「內部」,而不僅僅是在同一級別。 – 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和其他地方是相同的。另一種方法是使用明確的大括號和分號 - 雖然我認爲它實際上並沒有改進,但如果您希望在提示中輸入相對較短的內容作爲一行代碼,則它非常方便。我常常做的是在GVim窗口(或其他輕量級編輯器)中輸入多行定義,並將它們粘貼到GHCi中的':{'和':}'之間。 (另外請注意,如果您想打高爾夫球,使用守衛時換行符實際上是可選的。) – duplode

0

一個let縮進這樣

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

let有四個條目很像

let x1 = ... 
    x2 = ... 
    x3 = ... 
    x4 = ... 
,如果你想繼續先前的條目,而不是開始一個新的

,你應該更多的縮進它。該規則在源文件和GHCi中是相同的。縮進規則在開始時可能看起來有點神祕,但它實際上是fairly simple