在Haskell中应用函数列表

时间:2015-02-08 23:55:22

标签: haskell

我编写了一个将函数列表应用于项目的函数。

applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)

有更好的方法吗?

3 个答案:

答案 0 :(得分:18)

此函数实际上已作为monadic函数的特例出现:

applyAll :: [a -> b] -> a -> [b]
applyAll = sequence

答案 1 :(得分:8)

您可以使用:

 applyAll l v = fmap ($ v) l

fmap提升输入列表上的一个函数(实际上是任何Functor)。 $的类型为(a -> b) -> a -> b,因此它会将函数应用于给定值。 ($ v)section,它将给定的函数应用于v

答案 2 :(得分:6)

李的解决方案是我推荐的,但这可能更好看:

import Control.Applicative

applyAll' fs v = fs <*> pure v

applyAll'' fs v = fs <*> [v]

这种方式使得事情比必要的更复杂:我们实际上只需要Functor列表实例,而applyAll'注入并立即从Applicative实例中提取。