mymap f _ [] = []
mymap f x (y:ys) = f first y : mymap (f x ys)
where if x /= [] first = head(x) else --there will not be else just playing around
我想做的只是实现内置地图,而不是一个列表,f有2个参数(列表)。当ys变为[]时,我想创建一个新的列表,(通过调用mymamp)但是我想使用tail(x)== xs并继续使用tail,直到xs变为[]。并将所有这些列表列入最终列表。但是我无法找到一种自动/递归方式来实现它。
答案 0 :(得分:1)
首先,您在没有确认head(x)
不是空的情况下调用x
- 这不是一个好主意。相反,也可以在x
上使用模式匹配!
mymap f _ [] = []
mymap f (x:xs) (y:ys) = f x y : f x ys
-- add the other cases as well
现在,错误:请注意您已将f
用于地点:
f first y
- 此处f的类型为a->b->c
f x ys
- 此处f的类型为[a]->[b]->c
Haskell无法推断f
的类型,因此它进行了有根据的猜测并且无法推断另一个变量的类型 - 因此错误。
在这种情况下最好的建议 - 向mymap
添加类型签名。 Haskell是一种智能语言,在大多数情况下,它可以在没有您的类型签名的情况下管理得很好 - if ,如果,那就是,#&#> 39;重新编码有效。所以总是从类型签名开始。