如何解决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 举报,一经查实,本站将立刻删除。