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)
如所注释,您的递归无法在第二个参数中递归,因此定义为
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)