Type签名缺少适当的绑定[Haskell]

时间:2013-03-30 16:45:21

标签: haskell types compilation

我一直在谷歌上寻找答案,甚至在这里问了几个问题。这似乎是一个模棱两可的错误,我无法弄清楚如何在我的实例中解决它。

违规代码如下:

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类约束。如果有人可以指出什么是错误的或解决方法,我将非常感激,因为这是我正在进行的项目的门槛问题。

1 个答案:

答案 0 :(得分:5)

您为letterNumber提供了类型签名,但随后为lettNumber提供了绑定。请注意丢失的er

只需将lettNumber重命名为letterNumber,即可匹配类型签名中的拼写。


此外,letterNumber的正确类型签名是

letterNumber :: Char -> Int