2016-02-08 52 views
0

我想在haskell中使用where和let-in子句聲明局部變量(這是在haskell情況下的正確術語?)。然而,每當我的條款是不是一個單一的線長,我總是得到一些解析錯誤:Haskell中let和in子句的正確語法

> letExample :: Int -> Int 
> letExample 0 = 0 
> letExample n = 
>    let one  = 1 
>     four = 4 
>     eight = 8 
>    in one*four*eight 

當試圖在上面的代碼加載到ghci中我得到以下錯誤:

letexample.lhs:4:33: 
parse error in let binding: missing required 'in' Failed, modules loaded: none. 

whereexample:5:57: parse error on input ‘=’ 
Failed, modules loaded: none. 

代碼:

0123試圖加載下面的代碼時出現以下錯誤
> whereExample :: Int -> Int 
> whereExample 0 = 0 
> whereExample n = one * four * eight 
>    where one  = 1 
>      four = 4 
>      eight = 8 

在上述情況下使用let和where的正確方法是什麼?

+14

您的發佈代碼混合了製表符和空格,GHC將製表符視爲8個空格,並且這會打破縮進。我建議打開警告'-Wall',這樣編譯器就會報告這個警告,所以你知道有什麼問題。一個簡單的解決方案是避免製表符。有關更多解決方案,請參閱http://dmwit.com/tabs/ – chi

+1

**從不**混合選項卡和空格。它會在所有語言縮寫顯着的語言中打破代碼。檢查您的編輯器設置,並始終只使用製表符或僅使用空格(後者通常是首選)。 – Bakuriu

+0

爲了記錄,在StackOverflow上顯示的這些示例看起來具有完全正確的佈局和語法。 –

回答

2

發佈的代碼混合了製表符和空格。這是縮進問題的常見原因。

定義語言的Haskell報告聲明標籤等價於8個空格。如果您的編輯器配置爲將製表符顯示爲另一個空格,那麼很可能您正在閱讀的內容在正確的級別上縮進對於編譯器來說實際上並非如此。

最簡單的解決方法是用源文件中的空格替換tab。爲此,我建議打開傳遞-Wall標誌警告,或在你的源文件的開頭添加

{-# OPTIONS -Wall #-} 

。這樣做會導致GHC在檢測到選項卡時發出警告。

還有alternative solutions到劇烈的刪除所有選項卡之一。有一些聰明的方法可以將標籤和空格按「標籤不可知論」的方式混合使用,儘管標籤有多少空間,但這樣可以使代碼更易於編輯和閱讀。雖然不是很受歡迎,但這樣的提議有其技術優點。