我编写了一个将函数列表应用于项目的函数。
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
有更好的方法吗?
答案 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
实例中提取。