【发布时间】:2013-04-19 19:07:58
【问题描述】:
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 b c))
【问题讨论】:
-
您能否提供更多有关全局的背景信息?
Literal和Epsilon是什么?update是做什么的?您一般要达到什么目标? -
@AndrewC 这似乎是一个理想化的 NFA。我不知道
scanl表达式应该做什么,但 Reg 类型显然对应于非确定性正则表达式。 -
@Carl 这从 Edy 在我的评论后所做的编辑中可以明显看出,是的。