我一直在谷歌上寻找答案,甚至在这里问了几个问题。这似乎是一个模棱两可的错误,我无法弄清楚如何在我的实例中解决它。
违规代码如下:
pos :: (Eq a) => [a] -> a -> Int
pos [] _ = -1
pos (x:xs) y
| not $ elem y (x:xs) = -1
| x == y = 0
| otherwise = 1 + pos xs y
-- Get the same element from another range as one element of the first range.
refPos :: (Eq a) => [a] -> [b] -> a -> b
refPos r1 r2 e1 = r2 !! (r1 `pos` e1)
letterNumber :: (Eq a, Char a) => a -> Int
lettNumber x = refPos ['a'..'z'] [0..25] x
确切错误的文字是:
15:1 letterNumber的类型签名缺少附带的绑定。
最初我输入的类型签名是Char - > Int,但是没有用(它说了一些关于Eq的东西,但我也太新了Haskell来解释它)。所以我改变了类型签名以具有Eq类约束。如果有人可以指出什么是错误的或解决方法,我将非常感激,因为这是我正在进行的项目的门槛问题。
答案 0 :(得分:5)
您为letterNumber
提供了类型签名,但随后为lettNumber
提供了绑定。请注意丢失的er
。
只需将lettNumber
重命名为letterNumber
,即可匹配类型签名中的拼写。
此外,letterNumber
的正确类型签名是
letterNumber :: Char -> Int