作者:手机用户2602901335 | 来源:互联网 | 2023-07-11 12:35
我希望我的函数someZip
返回应用于f
每个元素的结果列表。
这是我到目前为止得到的:
someZip :: (a -> b -> c -> d) -> [(a,b,c)] -> [d]
someZip f (x:xs) (y:ys) (z:zs) = f x y z : someZip f xs ys zs
我尝试了不同的方法,但找不到解决此问题的方法。我现在完全迷失了,我在这里错过了什么?
回答
您编写的函数和您所针对的类型签名不一致。如果您喜欢类型签名,则需要更改定义
someZip :: (a -> b -> c -> d) -> [(a,b,c)] -> [d]
someZip _ [] = []
someZip f ((x,y,z):ts) = f x y z : someZip f ts
顺便说一下,这可以写成fmap
。
someZip :: (a -> b -> c -> d) -> [(a,b,c)] -> [d]
someZip f = fmap ((x, y, z) -> f x y z)
如果您更喜欢保留实现并更改类型签名,则需要采用更多参数
someZip :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
someZip f (x:xs) (y:ys) (z:zs) = f x y z : someZip f xs ys zs
someZip _ _ _ _ = []
顺便说一句,这个功能实际上是 zipWith3
someZip :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
someZip = zipWith3