【问题标题】:Scanl in Haskell在 Haskell 中扫描
【发布时间】: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))

【问题讨论】:

  • 您能否提供更多有关全局的背景信息? LiteralEpsilon 是什么? update 是做什么的?您一般要达到什么目标?
  • @AndrewC 这似乎是一个理想化的 NFA。我不知道 scanl 表达式应该做什么,但 Reg 类型显然对应于非确定性正则表达式。
  • @Carl 这从 Edy 在我的评论后所做的编辑中可以明显看出,是的。

标签: list haskell


【解决方案1】:

作为记录,scanl 不擅长传递状态,尤其是在这里,您根本不希望结果是一个列表,而只是一个最终结果。更通用的方法是改用fold

【讨论】:

    猜你喜欢
    • 2022-10-10
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多