微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell“ newtype”用于类型同义词

如何解决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) = --...
(请注意,我是在编译器中键入此字符,但基本上应该是正确的)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。