我写了一个函数,可以将一组函数应用到一个项上。
有没有更好的方式来做这件事情?
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
有没有更好的方式来做这件事情?
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
实际上,这个函数已经作为单子函数的特殊情况存在:
applyAll :: [a -> b] -> a -> [b]
applyAll = sequence
您可以使用:
applyAll l v = fmap ($ v) l
fmap
将一个函数提升到输入列表(实际上是任何Functor)上。$
的类型为(a -> b) -> a -> b
,因此它将一个函数应用于给定值。($ v)
是一个section,它将给定的函数应用于v
。
李的解决方案是我会推荐的,但这种说法甚至更好:
import Control.Applicative
applyAll' fs v = fs <*> pure v
或者
applyAll'' fs v = fs <*> [v]
这使得事情比必要的更加复杂,我们只需要列表的Functor
实例,而applyAll'
则是从Applicative
实例中注入并立即提取。
(-> b)
是无效的。我同意我仍然希望不规则章节语法可用!但至少有一些解释。 - Antal Spector-Zabusky