Haskell中的累加器

时间:2013-04-19 17:49:13

标签: variables haskell

我有这个功能:

map(\x -> if (isLetter x) then (update exp (Literal x) "") else Epsilon) "a+b+c+" where exp = Epsilon

我希望地图函数的每个步骤我的变量exp不是Epsilon但是要保持与之前的步骤相同,我还想保留中间结果列表。有人能帮我吗 ?

1 个答案:

答案 0 :(得分:3)

由于你想保留中间结果,我收集的直接翻译是意图

scanl (\exp x -> if (isLetter x) then update exp (Literal x) "" else Epsilon) Epsilon "a+b+c+"

scanl的类型是

Prelude> :t scanl
scanl :: (a -> b -> a) -> a -> [b] -> [a]

第一个参数是组合当前“状态”和下一个列表元素的函数,第二个参数是初始“状态”。因此,上面使用您提供的函数更新“状态”,调整为采用两个参数。

我不确定你是否真的想要将累加器重置为Epsilon每个非字母,如果没有,你需要更改组合功能,也许

\exp x -> if (isLetter x) then update exp (Literal x) "" else exp

保持累加器的旧值为非字母。