我有这个功能:
map(\x -> if (isLetter x) then (update exp (Literal x) "") else Epsilon) "a+b+c+" where exp = Epsilon
我希望地图函数的每个步骤我的变量exp不是Epsilon但是要保持与之前的步骤相同,我还想保留中间结果列表。有人能帮我吗 ?
答案 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
保持累加器的旧值为非字母。