将功能列表应用于输入列表的Haskell函数?

erd*_*asa 6 haskell functional-programming

我需要一个Haskell函数,该函数需要一个函数列表和一个元素列表,并将这些函数应用于此类元素:第一个函数应用于第一个元素,第二个函数应用于第二个元素,依此类推。如果任何列表停止,我希望功能停止。我想出的定义是:

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

我希望它能像这样工作:

apply [(+1), (*3), (^2)] [1,2,3] == [2,6,9]
apply [even, odd] [1..] == [False, False]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过的事情:

apply :: [(a -> b)] -> [a] -> [b]
apply [] _ = []
apply (f:fs) x = (f x) : (apply fs x)
Run Code Online (Sandbox Code Playgroud)

lsm*_*mor 7

如所注释,您的递归无法在第二个参数中递归,因此定义为

apply (f:fs) (x:xs) = (f x) : (apply fs xs) 
apply _      _      = []
Run Code Online (Sandbox Code Playgroud)

您可以免费使用

apply = zipWith ($) -- zipWith id works too as @Redu commented
Run Code Online (Sandbox Code Playgroud)

甚至更有趣的是,您可以疯狂地 ZipList

import Control.Applicative
apply f x = getZipList $ ZipList f <*> ZipList x
Run Code Online (Sandbox Code Playgroud)