2014-07-20 53 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)