我有这个功能:
map(\x -> if (isLetter x) then (update exp (Literal x) "") else Epsilon) "a+b+c+" where exp = Epsilon
我希望对于 map 函数的每一步,我的变量 exp 不是 Epsilon,而是与前一步保持相同,我还想保留中间结果列表。有人能帮我吗 ?
由于您想保留中间结果,因此我收集到的意图的直接翻译是
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
为非字母保留累加器的旧值。