我刚接触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
函数,以便像0
和23
这样的整数字面值可以代表该类型的值。)
它建议你可以为Num [Bool]
创建一个实例,这样它就可以编译它。这不是一个好主意,而且这个特定的错误消息通常是因为类型不匹配,而不是真正的丢失实例——值得下次记住。