将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


以上是将f应用于每个元素并将结果作为列表返回的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>