在Haskell中应用函数列表

xyz*_*yzt 4 haskell

我写了一个函数,它将一个函数列表应用于一个项目.

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)

  • 当你把`f`变为`(a - >)时,可能值得指出`[fb] - > f [b]`与`[a - > b] - >(a - > [b])`结合起来)`.(没关系它是无效的语法,它最好的点.) (4认同)

Lee*_*Lee 8

你可以使用:

 applyAll l v = fmap ($ v) l
Run Code Online (Sandbox Code Playgroud)

fmap在输入列表上提升功能(实际上是任何Functor).$具有类型,(a -> b) -> a -> b因此它将函数应用于给定值.($ v)是一个应用给定函数的部分v.

  • 什么时候这不会比显式递归替代更好?它更优雅,更简洁,更通用,可能更优化友好,可以在任何地方定义内联... (5认同)

lef*_*out 6

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

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实例中提取.