我写了一个函数,它将一个函数列表应用于一个项目.
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
Ørj*_*sen 18
该函数实际上已作为monadic函数的特例出现:
applyAll :: [a -> b] -> a -> [b]
applyAll = sequence
Run Code Online (Sandbox Code Playgroud)
你可以使用:
applyAll l v = fmap ($ v) l
Run Code Online (Sandbox Code Playgroud)
fmap在输入列表上提升功能(实际上是任何Functor).$具有类型,(a -> b) -> a -> b因此它将函数应用于给定值.($ v)是一个应用给定函数的部分v.
李的解决方案是我推荐的,但这可能更好看:
import Control.Applicative
applyAll' fs v = fs <*> pure v
Run Code Online (Sandbox Code Playgroud)
要么
applyAll'' fs v = fs <*> [v]
Run Code Online (Sandbox Code Playgroud)
但是这种方法使得事情比必要的更复杂:我们实际上只需要Functor列表实例,而applyAll'注入并立即从Applicative实例中提取.