在哈斯克尔的Scanl

时间:2013-04-19 19:07:58

标签: list haskell

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))

1 个答案:

答案 0 :(得分:0)

为了记录,scanl在传递状态方面并不是很好,特别是在这里你根本不希望结果成为一个列表,而只是最终的结果。更通用的方法是使用fold代替。