2010-08-09 71 views
6

功能解析錯誤Haskell的錯誤:輸入'=」

GHC 6.12.1

的Mac OS X 10.6.4 64

的MacBook Pro

問題

我在使用let語法時遇到問題。下面的代碼拒絕編譯:

module Main where 

main = let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

我試着在y = 2z = 3跳格甚至更多。沒有骰子。

(不良)解決方案

我已經得到的代碼編譯的唯一辦法是要麼

  1. 更換硬標籤用空格。
  2. where子句替換let子句。
+2

結束絕不使用製表符哈斯克爾,總是使用空格。haskell中的選項卡被定義爲8個空格,這比人們經常期望/設置編輯器的空間要多得多,因此總是建議您使用空格。任何體面的編輯器都會讓你製作空間。 – Axman6 2010-10-30 01:58:43

+0

我發現這是一個出色的視覺輔助工具,並且在整體主題上提供了極好的指導:[http://echo.rsmw.net/n00bfaq.html#visualaid](http://echo.rsmw.net/n00bfaq.html# visualaid) – Brandon 2011-09-02 00:44:30

回答

15

Saizan上#haskell解釋說,分配在讓表達式必須對齊,不本身。只要分配對齊,可以使用硬標籤或軟標籤。

正確的代碼:

module Main where 

main = let 
     x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+1

我發現綁定(x,y,z)必須垂直對齊,而不是使用此示例很難看到的3個綁定的賦值符號(=)。 – ssanj 2014-01-30 03:59:06

3

將let-block中的每個聲明縮進到相同的程度。同樣好的形式是將'in'和'let'縮進同一級別。例如..

main = let x = 1 
      y = 2 
      z = 3 
     in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

如何使用硬標籤來做到這一點? – mcandre 2010-08-09 01:28:34

+9

你爲什麼要使用硬標籤?對於不使用縮進來表達意義的語言來說,它們並沒有什麼問題,但它們只會讓Haskell或Python等語言的生活變得困難。就像他們現在一樣。 – jrockway 2010-08-09 01:50:29

+4

Python很好地處理硬標籤。有一次,我無法通過Web SSH客戶端編碼Python,因爲客戶端無法插入選項卡。我使用硬標籤,因爲我討厭必須強行將其他人的代碼重新加入到我的首選縮進寬度。硬標籤沒有這個問題,因爲文本編輯器可以在任何寬度上查看硬標籤。 – mcandre 2010-08-10 13:29:29

11

你根本不能正確地使用標籤,因爲標籤的大小是不確定的控制縮進。

因此,不要在Haskell中使用選項卡。他們是邪惡的。

+3

或者,對於需要具有不同級別縮進的事物,請使用新行。例如,在下一行放置'let'並且放置'x = 1'。然後標籤是沒有問題的。 – yfeldblum 2010-08-09 14:52:09

+0

尼爾,我懇求不同(見我的答案)。 #haskell上的一個人能夠幫助我構建一個編譯,硬標籤的版本。事實上,司法部的答案是正確的。 – mcandre 2010-08-10 13:31:20

+0

我以艱辛的方式學會了我的教訓!我知道選項卡是可怕的,但仍然使用,因爲它之前從未給我一個問題。如果你像我一樣,爲自己節省一筆巨大的未來頭痛,現在就接受這個建議吧! – MasterMastic 2014-04-22 18:11:55

1

如果你堅持製表符源,以下編譯:

module Main where 

main = 
    let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

所有前導空格是一個或兩個選項卡,並letx = 1之間的空白也是TAB。在vi的list mode看,使標籤和行結束明確:

module Main where$ 
$ 
main =$ 
^Ilet^Ix = 1$ 
^I^Iy = 2$ 
^I^Iz = 3$ 
^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$

你的生活會更簡單,你的代碼更漂亮,如果你切換到空間。

+0

謝謝。我不認爲每次都想記住let和x之間的選項。另外,我發佈的任何代碼都可能會導致錯誤,因爲讀者會認爲這裏有一個普通的空間。 – mcandre 2010-08-10 13:27:22

+0

因此,爲什麼硬標籤讓你的代碼更難編碼和閱讀! – adamse 2010-08-11 16:49:04

2

就個人而言,我把分號每一行

module Main where 

main = let x = 1 ; 
      y = 2 ; 
      z = 3 
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

它將使用分號,但我不會使用,因爲語言可以正常工作。僅用於縮進,請使用空格而不是製表符(或製表符正確)。 – Jaider 2012-11-15 19:29:36