Haskell映射定义错误

时间:2014-04-22 02:25:31

标签: haskell

我最近遇到了Haskell,在尝试编写我对map函数的定义时遇到了问题。 示例:mapi(> 2)[1,2,3,4,5] = [False,False,True,True,True]

mapi _ [] = 0
mapi f (x:xs) = [f x] ++ mapi f xs

当我尝试这个时,我得到错误:

No instance for (Num [Bool]) arising from a use of `mapi'
Possible fix: add an instance declaration for (Num [Bool])
In the expression: mapi (> 2) [1, 2, 3, 4, ....]
In an equation for `it': it = mapi (> 2) [1, 2, 3, ....]

我知道它与:mapi _ [] = 0有关但我找不到问题,我的意思是,它必须停在[]上!

1 个答案:

答案 0 :(得分:6)

在第一种情况下,您不小心返回了0而不是[]。它应该是

mapi _ [] = []
mapi f (x:xs) = [f x] ++ mapi f xs

如果你写了一个类型签名,它会有所帮助:

mapi :: (a->b) -> [a] -> [b]

所以mapi应该是一个函数,一个列表,并返回一个列表。 0不是列表,但是[]是。

没有......的实例

该错误消息表示它正试图将0转换为[Bool],它将使用fromInteger类中的Num函数执行此操作,但{{1}不是数字类型,所以它卡住了。 (每个[Bool]实例必须具有精确的Num函数,以便fromInteger0等整数文字可以代表该类型的值。)

它建议你可以为23创建一个实例,以便它可以编译它。这不是一个好主意,而这个特殊的错误信息通常是因为类型不匹配而不是真正的缺失实例 - 值得记住下次。