2013-01-13 92 views
0

我必須錯過的東西,但我不明白爲什麼這個人爲的例子不工作:哈斯克爾嵌套讓拉姆達

test1 :: Int 
test1 = let g = \s -> s + s 
      f = \u -> let h = \t -> t + t 
          h' = \v -> v + v 
         in g (h (h' u)) 
     in f 1 

ghci中>解析錯誤輸入'H「」

然而,這相當於一塊:

test2 :: Int 
test2 = let g = \s -> s + s 
      f = \u -> let h = \t -> t + t; h' = \v -> v + v 
         in g (h (h' u)) 
     in f 1 

我認爲這是我的語法問題,但我在test1中看不到任何錯誤。謝謝。

編輯: 感謝您指出正確的方式來找到問題。 事實證明,這與vim-haskellConceal插件有關。我在另一個編輯器中複製粘貼 - 保存代碼,然後切換回vim並在嵌套的let-in塊中注意不同的縮進。刪除該插件後一切正常。

編輯: 我應該停止指責這個插件,因爲我簡要閱讀了它的代碼而沒有發現任何不適當的東西。也許vim7.3中的「隱藏」功能是根本原因。但我寧願喜歡去我溫暖舒適的牀上......

+0

無法複製,在這裏編譯爲複製粘貼。你有沒有在某處使用標籤? –

+0

問題是,在隱藏功能處於活動狀態時,' - >'箭頭顯示爲只有1個字符寬而不是2個。因此,當您在編輯器中將'h'與'h'對齊時,'h''行實際上縮進1空間比它應該是。 – hammar

回答

2

它確實有效。我只是跑的代碼,並得到

~ % ghci Hello.hs 
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (Hello.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> test1 
8 
*Main> 

換句話說,確保你不會在你的代碼有任何製表符(\t)!

+0

是的,幾乎肯定是編輯器顯示標籤隱藏的縮進問題不同於Haskell解析它們。 –