Haskell映射定义错误



我刚接触Haskell,在编写映射函数的定义时遇到了问题。示例: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有关,但我找不到问题出在哪里,我的意思是,它必须在[]上停止!

在第一种情况下,您意外地返回了0而不是[]。应该是

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

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

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

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

没有…的例子

错误消息说它试图将0转换为[Bool],这将与Num类中的fromInteger函数一起完成,但[Bool]不是数字类型,因此它被卡住了。(每个Num实例都必须精确地具有fromInteger函数,以便像023这样的整数字面值可以代表该类型的值。)

它建议你可以为Num [Bool]创建一个实例,这样它就可以编译它。这不是一个好主意,而且这个特定的错误消息通常是因为类型不匹配,而不是真正的丢失实例——值得下次记住。

最新更新