2012-06-29 39 views
2

從哪裏可以獲得Haskell代碼寫入的完整縮進規則集?haskell中的一組縮進規則

過去的SO問題與我以下的問題類似,導致我問上面的問題。錯誤消息背後的原因是什麼:parse error on input 'something'

錯誤消息我:

baby.hs:103:2:輸入`myList中「(在這一行錯誤)

碼分析錯誤我試圖編譯:

myList = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"] 
quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = 
let smallerSorted = quicksort [a | a <- xs, a <= x] 
biggerSorted = quicksort [a | a <- xs, a > x] 
in smallerSorted ++ [x] ++ biggerSorted 

編輯由Optimight:

我的問題轉向新的代碼。 hs文件並試圖編譯它。仍然有類似的錯誤信息。

錯誤
quickSort.hs:5:62:下面詳細解析錯誤輸入'=」 失敗,加載的模塊:無。 (0.02秒,0字節)

代碼 快速排序::(ORD一個)=>並[a] - >並[a]
快速排序[] = [] 快速排序(X:XS)= 讓smallerSorted = quicksort [a | a < - xs,a < = x]
largerSorted = quicksort [a | a < - xs,a> x]
in smallerSorted ++ [x] ++更大排序
myList = [「飛機」,「飛機」,「飛機」,「直升機」,「直升機」,「斑馬」 「美國」]

+3

語言報告,特別是http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7和http://www.haskell.org/onlinereport/haskell2010/haskellch10 .html#x17-17800010.3 –

+0

第103行是定義'myList'的列表嗎?它之前的行是什麼? – dave4420

+0

@ dave4420先生,我從「Learn-you-a-haskell」學習,並將我的所有代碼示例保存到相同的文件中,即baby.hs。前面的行包括那些代碼示例。 – Optimight

回答

10

至少爲標準哈斯克爾(無語言擴展),佈局規則解釋in Section 10.3 of the Haskell 2010 report.

該報告可能會有點正式對你的口味。關於Haskell的各種教程和教科書對佈局規則有一些非正式的解釋,例如Haskell Wikibook.

在您的特定情況下,錯誤消息指向第103行,但您只是粘貼幾行。我可以看到,至少let-in結構的縮進被打破了。你應該寫像下面這樣:

xs = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"] 
quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = let smallerSorted = quicksort [a | a <- xs, a <= x] 
         biggerSorted = quicksort [a | a <- xs, a > x] 
        in smallerSorted ++ [x] ++ biggerSorted 
+0

錯誤仍然存​​在。我把xs聲明放在最後一行,然後錯誤(輸入'='的解析錯誤)轉移到了這一行:largerSorted = quicksort [a | a <- xs, a > x] – Optimight

+0

@Optimight,縮進代碼適用於我。您使用空格而不是製表符縮進,對嗎? – Heatsink

+0

@Heatsink我使用gedit編寫代碼。是的,我正在使用選項卡,但設置爲插入空格。 – Optimight

2

如果我理解你寫單dolet這樣來避免這個問題正確的最簡單方法是:

fName = do 
    expression1 = ... 
    exp2 ... 

fName param = let 
    exp1 = ... 
    exp2 = ... 
    exp3 = ... 
    in ...  -- can be indented more if you want 
這裏

主要的一點是,第一縮進在exp1很容易發現和維護每一個新的生產線。




下面是從我的學習表的複製/粘貼。這不是很多,但可能會幫助某人。 如果有人發現任何錯誤/錯誤,請糾正我。

製表符或空格表示BLOCK,如{com1; com2}在C++中

越位規則:在源文件的開頭,第一個頂級 聲明或定義可以在任何列中開始。每個後續 頂級聲明都必須具有相同的縮進!

LET IN,WHERE記住它看到的下一個標記的縮進。如果空行 行或縮進比右側更接近上一行。 如果相同的縮進,這是同一個塊中新項目的開始。

win選項卡4 spc,unix選項卡8個空格使用空格替代選項卡!!!

line1... 
    continue line 1 -- as long it doesn't start at same indent as line1 
    3spaces would indicate block with line 1! 
    line4 same block 
    same indent is same line1 block 
    all indents for BLOCK must be same. 

line8... -- is new block and end of line1 block 
    positon of first column in block is start 

line 1 
cont line1 
    cont line 1 
    cont line 1 
    block1 -- would be cont line 1 
    block1 -- if not for this block1 at same indent 


Bad way: 
do 
    action0 
    if condition 
    then action1 
    else action2 
    action3 

Good way: 
do 
    action0 
    if condition 
    then action1 
    else action2 
    action3