就像标题所说的那样。我已经实现了这个,但是这个函数可能已经有一个通用名称,并且存在于标准库中。
欢迎提供有关此功能的其他建议。也许有更清洁的实施。
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]
答案 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 (,) .)