0

我有这个功能:

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

我希望对于 map 函数的每一步,我的变量 exp 不是 Epsilon,而是与前一步保持相同,我还想保留中间结果列表。有人能帮我吗 ?

4

1 回答 1

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

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

于 2013-04-19T18:02:00.780 回答