2014-07-20 79 views
0

我有此代碼的問題:Couln't匹配類型

rango2 :: Int -> [Int] -> [[Int]] -> [Int] 
rango2 a b list = if (verif (map(+list!!a!!2)(list!!a)) (map(-list!!a!!2)(list!!a)) (b)) then [1] 
       else [0] 

verif :: [Int] -> [Int] -> [Int] -> Bool 
verif a b c = if ((c!!0 < ((a!!0)+1)) && (((c!!0)+1) > b!!0) && (c!!1 < ((a!!1)+1)) && (((c!!1)+1) > b!!1)) then True 
      else False 

運行時,它會產生這樣的錯誤:

Couldn't match type `Int' with `Int -> Int' 
Expected type: [[Int -> Int]] 
    Actual type: [[Int]] 
In the first argument of `(!!)', namely `list' 
In the first argument of `(!!)', namely `list !! a' 
In the expression: list !! a !! 2 
+0

['map'](http://hackage.haskell.org/package/base-4.7.0.1/docs/Prelude.html#v:map)需要兩個參數,其中第一個參數是一個函數。你似乎在'rango2'中傳遞了三個參數。 –

+1

你到處使用'x !! 0'這一事實可能表明你最好由[基本的haskell教程](http://learnyouahaskell.com/)提供。 – user2407038

+1

@ user2407038:雖然'!! 0'確實不是慣用的,它並不比'頭部'更糟糕,它(雖然通常被皺眉)有時是合理的使用。真正糟糕的是(儘管如此,有時可以批准)將索引列入更大的索引:它不僅不安全,而且效率低下。而這些「魔術指數」'!! 2'也有不同的原因:可讀性,類型推理,重構魯棒性......很可能,許多OP的列表應該更好地成爲有意義的ADT。 – leftaroundabout

回答

6

問題是(-list!!a!!2)。是的,這看起來像一個操作員部分,類似於(+list!!a!!2)。但是,唉,負運算符傳統上也被用作唯一的負面前綴,而Haskell已經將這個特殊情況放入了語言中;所以(-list!!a!!2)實際上只是一個負數而不是減法函數。您可以使用(subtract $ list!!a!!2)