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”]转换为(然后a(或b c))
答案 0 :(得分:0)
为了记录,scanl
在传递状态方面并不是很好,特别是在这里你根本不希望结果成为一个列表,而只是最终的结果。更通用的方法是使用fold
代替。