gpt4 book ai didi

Haskell "newtype"用于类型同义词

转载 作者:行者123 更新时间:2023-12-02 16:57:33 25 4
gpt4 key购买 nike

我正在用 SAT 做一些事情,我想要同时有“and”和“or”子句。

type AndClause = [Literal]
type OrClause = [Literal]

但是我在使用它们时遇到了问题:

instance Satisfiable AndClause where ...
instance Satisfiable OrClause where ...

给我“重复的实例声明”。它们是类型,而不是数据或类型构造函数,所以我认为我不能使用 newtype 来做我想做的事情。有什么解决办法吗?

最佳答案

问题是您似乎同时想要两个相互冲突的事情:

  1. 您希望同一类型有不同的名称
  2. 您希望编译器将这两个类型名称理解为引用不同的类型

基于域,我认为您当然不想使用类型同义词,并且您确实需要实际的新类型(带有随附的类型构造函数)。如果 AndClause[Literal] 的同义词,而 OrClause[Literal] 的同义词,则通过传递属性 AndClauseOrClause 互为同义词。因此,编译器没有理由区分它们(因此,不可能存在多态性)。

您真正想要的是两种行为不同的不同类型,对于其中 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) = --...

(请注意,我是通过编译器输入的,但它基本上应该是正确的)。

关于Haskell "newtype"用于类型同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com