Haskell中是否有任何函数将两个参数函数应用于两个列表,逐个元素?

Vic*_*ães 1 haskell

我只是想逐个元素地将两个列表相乘,所以我将(*)作为该函数的第一个参数传递:

apply :: Num a => (a -> a -> a) -> [a] -> [a] -> [a]
apply f xs ys = [f (xs !! i) (ys !! i) | i <- [0..(length xs - 1)]]
Run Code Online (Sandbox Code Playgroud)

我可能会问一个愚蠢的问题,但我实际上搜索了很多,但却找不到.感谢你们!

chi*_*chi 10

> :t zipWith
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
> zipWith (*) [1,2,3] [4,5,6]
[4,10,18]
Run Code Online (Sandbox Code Playgroud)

这是Hoogle在查询您的类型时提供的第八个结果

(a -> a -> a) -> [a] -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

此外,当你需要实现自己的功能时,list !! index只能作为最后的手段使用,因为它通常会导致性能不佳,成本会降低O(index).同样,length应该只在必要时使用,因为它需要扫描整个列表.

在这种zipWith情况下,您可以避免这两种情况并以自然的方式递归地进行:它大致实现为

zipWith _ []     _      = []
zipWith _ _      []     = []
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
Run Code Online (Sandbox Code Playgroud)

请注意,这只会递归到达最短列表末尾所需的数量.较长列表的剩余部分将被丢弃.