【问题标题】:How to pattern match for the infix / operator in Haskell?如何对 Haskell 中的中缀 / 运算符进行模式匹配?
【发布时间】:2014-05-23 15:10:50
【问题描述】:

我正在尝试在 Haskell 中编写递归数据结构以表示表达式树。我有这种数据类型:

data Expr =
    And(Expr, Expr ) |
    Or (Expr, Expr ) |
    (/) Expr Expr

我想对函数中的每个数据构造函数进行模式匹配:

toStringE :: Expr -> String
toStringE e = case e of 
    And(a,b) -> "and(" ++ toStringE a ++ ", " ++ toStringE b ++ ")"
    Or(a,b) -> "or(" ++ toStringE a ++ ", " ++ toStringE b ++ ")"
    (/) expr1 expr2 -> (toStringE expr1) ++ " / " ++ (toStringE expr2)

但是当我尝试编译时,我在 toStringE 函数的最后一行得到这个错误:

Parse error in pattern: (/)

你认为我做错了什么?

【问题讨论】:

  • 一个建议:data Expr = And Expr Expr | Or Expr Expr | (:/) Expr Expr。或data Expr = Expr `And` Expr | ...。但是请不要使用元组。一次也没有。
  • 我明白你的意思了,谢谢!

标签: haskell


【解决方案1】:

(/) 不是有效的中缀数据构造函数。所有有效的中缀数据构造函数都以: 开头。例如,您可以将构造函数命名为 (:/)

这样做的原因是模式匹配取决于判断某事物是否是构造函数的能力。它通过检查标识符的第一个字符来做到这一点。如果是大写字母或:,则为构造函数。如果不是其中之一,则它是一个受模式匹配约束的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多