当您声明代数数据类型时,声明的右侧是该类型的可能构造函数的“列表”。但是,构造函数只是函数,这意味着它们以前缀表示法使用。您尝试以And
不起作用的中缀方式使用 eg 构造函数。
以下代码运行良好:
data Prop
= Not Prop
| And Prop Prop
| Or Prop Prop
| Impl Prop Prop
| Equiv Prop Prop
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
但是,您可以定义模仿构造函数的函数,例如 --
propAnd :: Prop -> Prop -> Prop
propAnd a b = And a b
并使用反引号以中缀方式使用它们:a `propAnd` b
.
正如评论中所建议的,这不是必需的,因为And
已经可以以中缀方式使用:a `And` b
另一种选择是以中缀方式定义构造函数本身:
data Prop
= Not Prop
| Prop `And` Prop
| Prop `Or` Prop
| Prop `Impl` Prop
| Prop `Equiv` Prop
| ForAll String Prop
| Exists String Prop
deriving (Eq, Ord)
然后两者都a `And` b
工作And a b
。
注意:您的数据类型是无限的,因为所有构造函数都采用一个或多个Prop
s。我认为您还应该包括一些“原子”构造函数。