2013-03-29 86 views
7
pow1 b e 
| (e == 0) = 1 
| otherwise = b * pow1 b (e-1) 

我確實在.hs文件中的代碼和加載時總是得到相同的分析錯誤。我不認爲它實際上包含任何錯誤 - 所以我目前的想法是,「|」簽名不是haskell想要的,但它是我Macbook鍵盤上的標準版本(使用Mac OS)。是否有可能,如果有的話,我該如何解決它?目前我正在使用TextEdit編寫代碼,其中的純文本設置。Haskell - 輸入`|'解析錯誤

+2

我強烈建議使用一個好的Haskell編輯器(Vim,Emacs,Sublime Text 2)而不是TextEdit。 – 2013-03-30 00:25:00

回答

14

一定要縮進警衛; Haskell有重要的空白。

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 
+3

並添加:用空格縮進,* not *製表符。 (例如,確保您的編輯器將製表符轉換爲空格)。 – huon

+2

Haskell具有明顯的空白,*除非*您想用括號編寫代碼 – amindfv

5

所有你需要做的是在後衛前面加空格,代碼將正常工作。

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 

(user142019已經指出這種解決方案,但是我覺得需要一種解釋理解溶液)

說明:

Haskell使用空間壓痕以控制的結構和範圍它是代碼。其他的編程語言(比如Java)依靠大括號來完成這個任務,Haskell改爲縮進。

您的代碼無法正常工作,因爲Haskell期望函數體在比函數定義更深的縮進級別以及同一級別上的其他函數定義上。在同一縮進級別上的任何新行將被嘗試解釋爲新的函數定義,但不允許他們以後衛|開頭,因此會出現解析錯誤。

您的Mac字符鍵和您的文本編輯器沒有任何問題。

關於縮進主題:選項卡不起作用。所以你將不得不手動輸入空格或更改編輯器的選項卡設置,以插入4個空格(我推薦)而不是製表符。 (記事本++允許這個例子,它是我最喜歡的與Haskell一起使用的選擇)。