将 f 应用于每个元素并将结果作为列表返回

-1 haskell

我希望我的函数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
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的方法,但找不到解决此问题的方法。我现在完全迷失了,我在这里错过了什么?

Sil*_*olo 7

您编写的函数和您所针对的类型签名不一致。如果您喜欢类型签名,则需要更改定义

someZip :: (a -> b -> c -> d) -> [(a,b,c)] -> [d]
someZip _ [] = []
someZip f ((x,y,z):ts)  = f x y z : someZip f ts
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这可以写成fmap

someZip :: (a -> b -> c -> d) -> [(a,b,c)] -> [d]
someZip f = fmap (\(x, y, z) -> f x y z)
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢保留实现并更改类型签名,则需要采用更多参数

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 _ _ _ _ = []
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这个功能实际上是 zipWith3

someZip :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
someZip = zipWith3
Run Code Online (Sandbox Code Playgroud)