Haskell“ newtype”用于类型同义词

| 我正在用SAT做一些事情,我想同时拥有\“ and \”和\“ or \”子句。
type AndClause = [Literal]
type OrClause  = [Literal]
但是使用它们时我遇到了问题:
instance Satisfiable AndClause where ...
instance Satisfiable OrClause where ...
给我“重复的实例声明。”它们是类型,而不是数据或类型构造函数,因此我认为我无法使用newtype来完成所需的操作。有什么解决办法吗?     
已邀请:
问题是您似乎一次想要两个冲突的事物: 您想要相同类型的不同名称 您希望编译器将这两个类型名称理解为引用不同的类型 基于域,我认为您当然不希望使用类型同义词,而您确实希望使用实际的新类型(带有随附的类型构造函数)。如果
AndClause
[Literal]
的同义词,而
OrClause
[Literal]
的同义词,则根据传递性质,
AndClause
OrClause
是互为同义词。因此,编译器没有理由在它们之间进行区分(因此,不能有多态性)。 您真正想要的是两种行为不同的不同类型,对于它们,
newtype
就可以了:
newtype AndClause = AndClause [Literal]
newtype OrClause = OrClause [Literal]

instance Satisfiable AndClause where
  satisfy (AndClause l:ls) = --...

instance Satisfiable OrClause where
  satisfy (OrClause l:ls) = --...
但是,一个更好的主意可能是使其成为代数数据类型:
data Prop = And [Literal]
          | Or [Literal]

instance Satisfiable Prop where
  satisfy (And l:ls) = --...
  satisfy (Or l:ls) = --...
(请注意,我是在编译器中键入此字符,但基本上应该是正确的)。     

要回复问题请先登录注册