将函数列表中的每个函数逐渐应用于某个值,累积结果的函数的名称是什么?

时间:2014-01-22 16:47:04

标签: haskell

就像标题所说的那样。我已经实现了这个,但是这个函数可能已经有一个通用名称,并且存在于标准库中。

欢迎提供有关此功能的其他建议。也许有更清洁的实施。

let transform x funcList = transform' x [x] funcList
        where transform' startVal accum funcList 
                   | null funcList = reverse accum
                   | otherwise = let result = (head funcList) startVal
                                     in transform' result (result:accum) $ tail funcList

执行时,它会执行以下操作:

> transform 2 [(2 + ),((-1) +),(3 *)]
[2,4,3,9]

2 个答案:

答案 0 :(得分:10)

您可以使用scanl

进行定义
let transform = scanl (\v f -> f v)

let transform = scanl (flip ($))

答案 1 :(得分:1)

我的建议不如scanl那么好,但也许它可以对问题提出不同的看法。我们正在进行有条不紊的遍历。我们将每个函数转换为一个State值,该值接受一个输入,将函数应用于它并返回该值并将其作为下一个状态。然后我们需要做的就是在整个列表中mapM

import Control.Monad.State

trans :: a -> [a -> a] -> [a]
trans s fs = s : evalState (mapM toState fs) s
  where
    -- join (,) just makes a tuple out of a value
    -- using the reader monad
    toState = state . (join (,) .)