如何在Haskell中对中缀/运算符进行模式匹配?

时间:2014-05-23 15:10:51

标签: haskell

我正在尝试在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: (/)

你认为我做错了什么?

1 个答案:

答案 0 :(得分:11)

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

这样做的原因是模式匹配取决于能否确定某些东西是构造函数还是不是词法。它通过检查标识符的第一个字符来做到这一点。如果它是大写字母或:,则它是构造函数。如果它不是其中之一,那么它就是一个受模式匹配约束的变量。