【问题标题】:Ord: No type class instance was found for Data.Eq.Eq (Extended a0). PureScript by Example book, Chapter 6Ord:未找到 Data.Eq.Eq(扩展 a0)的类型类实例。 PureScript by Example 一书,第 6 章
【发布时间】:2020-11-14 14:12:24
【问题描述】:

我对 Haskell/Purescript 还很陌生,目前正在学习 PureScript by Example book

chapter 6 关于类型类中,exercise 4 有以下任务:

(中)给定任何类型aOrd 的实例,我们可以添加一个新的“无限”值,该值大于任何其他值:

data Extended a = Finite a | Infinite

Extended a 编写一个Ord 实例,该实例重用aOrd 实例。

这是我的尝试:
instance ordExtended :: Ord a => Ord (Extended a) where
  compare Infinite Infinite = EQ
  compare Infinite _ = GT
  compare _ Infinite = LT
  compare (Finite f1) (Finite f2) = compare f1 f2

不幸的是,代码触发了错误:

找不到类型类实例

Data.Eq.Eq(扩展 a0)

同时检查表达式#dict Eq 具有类型 { eq :: Extended a0 -> Extended a0 -> Boolean } 在值声明中排序扩展

其中 a0 是刚性类型变量 绑定在(第 0 行,第 0 列 - 第 0 行,第 0 列) PureScript(NoInstanceFound)

我不太明白错误信息:

  1. expression #dict Eq 是什么意思?我的代码中没有dict
  2. 什么是刚性类型变量?
  3. 该错误似乎使用了不同的标识符,例如a0(为什么?我假设是a

在我的书中,Eq 类型类实例应该通过实现Ord 来覆盖,因为Ord 扩展了Eq

【问题讨论】:

  • Haskell 不是纯脚本。我不知道你为什么要用 Haskell 标记一个纯脚本问题。
  • @Aplet123 至少从我读到的内容来看,Purescript 的许多语法/语言特性几乎等同于 Haskell(如类型类特性)。因此,想法是,这个问题也可能由有 Haskell 经验的人来回答。

标签: typeclass purescript


【解决方案1】:

错误的关键部分在开头:

No type class instance was found for

    Data.Eq.Eq (Extended a0)

这里是Ord的定义:

class Eq a <= Ord a where
  compare :: a -> a -> Ordering

这实际上是superclass 语法,表示您需要一个Eq 实例才能拥有一个Ord 实例。因此,您可以通过创建 Eq 实例来修复错误:

instance eqExtended :: Eq a => Eq (Extended a) where
  eq Infinite Infinite = true
  eq (Finite f1) (Finite f2) = eq f1 f2
  eq _ _ = false

instance ordExtended :: Ord a => Ord (Extended a) where
  compare Infinite Infinite = EQ
  compare Infinite _ = GT
  compare _ Infinite = LT
  compare (Finite f1) (Finite f2) = compare f1 f2

至于为什么使用a0,purescript 编译器似乎只是喜欢在类型变量后添加数字,可能是为了减少模糊性或允许范围类型变量。您可以read about rigid type variables here(它们基本上是无法更改以适应约束的变量)。

【讨论】:

  • 啊,我的假设是错误的,将类型变量 a 约束到 Ord 就足以使 Extended 成为 Ord 的实例(以及 Eq 的传递实例)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多