2014-11-15 32 views
-1

我有這樣的代碼,它的工作,但是當我添加此語句不工作:解析錯誤(可能是不正確的縮進或不匹配的括號內),如果其他

do 

let r = .... 

我得到一個錯誤。代碼:

paly :: Matrix -> String->Int -> Matrix 
paly mat flag 10 =mat 
paly mat flag i =do 
          let a=1 
          let b=2 
          ..... 
          if a/=(-1) ||b/=(-1) then 
           if y==2 then 
            take x mat ++ 
            [take x (mat !! y) ++ [flag] ++ drop (x + 1) (mat !! x)] ++ 
            drop (y + 1) mat 
           else if a==2 then 
            take a mat ++ 
            [take a (mat !! y) ++ [flag] ++ drop (x + 1) (mat !! x)] ++ 
            drop (y + 1) mat 
           else if b==2 then 
                --do 
                 --let r = posState mat 
                 take b mat ++ 
                 [take x (mat !! y) ++ [flag] ++ drop (x + 1) (mat !! x)] ++ 
                 drop (y + 1) mat 
           else 
            take c mat ++ 
            [take c (mat !! y) ++ [flag] ++ drop (x + 1) (mat !! x)] ++ 
            drop (y + 1) mat 
          else 
           paly mat flag (i+1) 
+1

是的,在Haskell中必須要有一個更好的書寫方式。它有什麼作用?問題可能是你的'let'應該排在其他地方。首先,擺脫所有這些選項卡並使用空格(並且不要縮進到目前爲止)。選項卡出了名的問題,因爲編輯和編譯器可以以不同的方式思考它們。 – AndrewC

+0

這個問題與[tag:haskell-platform]或[tag:haskell-pipes]無關。 – dfeuer

+0

此代碼示例有很多內容。你有'讓a = 1',然後'如果a/= -1'永遠是真的,因爲'a'是1,除非你在某個地方遮蔽了名字。此外,您不會告訴我們您遇到了什麼錯誤,或者您在問題頂部添加了哪些代碼。 –

回答

2

它看起來像一個間隔的問題,而不是解決這個問題,我會告訴你,如果你重寫這個方法來寫你的嵌套IFS

case (a, b, y) of 
    (-1, -1, _) -> something 
    (2, _, 2) -> somethingElse 
    (_, 2, 2) ->yetSomethingElse 
    _ -> defaultThing 

一個更清潔的方式,它會修復代碼要容易得多。

+0

對不起,但我不理解你,我應該在哪裏放置代碼! –

+0

把每個if-then-else情況下的東西放在適當的情況下......所以,就像'如果cond那麼一個else''變成''真的情況cond - > a; _ - > b'。對於一個「if」,這兩種方法都不是很乾淨,但對於嵌套的if語句,後者是非常優越的(一方面,沒有嵌套)。 – jamshidh

相關問題