0
scanl (\exp y -> scanl (\x -> if (isLetter x) then update exp (Literal x) "" else 
                    if x=='+' then update exp Epsilon "+" else
                    if x=='*' then update exp Epsilon "*" else
                    update exp Epsilon "|") y) Epsilon q

我有一个 [Char] 列表,我想将它们转换为我的数据类型,但我遇到了一些问题。我有类似 ["a+b","c*d"] 的东西,我希望保留在 "a+b" 上应用 scanl 时的结果,以便我可以将它用于第二个列表。有人能帮我吗 ?

我的数据类型是:

data Reg = Epsilon | Literal Char | Or Reg Reg |  Then Reg Reg |  Star Reg  deriving Eq

update:: Reg -> Reg -> [Char] -> Reg 
update a b "" = (a `Then` b)
update a b "|"= (a `Or` b) 
update a b "*" = (Star a) 
update a b "+" = (plus a)
update a b "?" = (opt a)  

我正在尝试将这样的 ["a|","bc"] 转换为 (Then a (Or bc))

4

1 回答 1

0

作为记录,scanl它不擅长传递状态,尤其是在这里,您根本不希望结果成为列表,而只是最终结果。更通用的方法是使用 afold代替。

于 2016-03-04T22:28:00.817 回答