将f应用于每个元素并将结果作为列表返回
我希望我的函数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