gpt4 book ai didi

haskell - `Eq` 的类型系列等效项?

转载 作者:行者123 更新时间:2023-12-02 18:30:39 25 4
gpt4 key购买 nike

Type Families with Class显示:

enter image description here

据我不完全理解,这张幻灯片展示了实现 Eq 的 2 种方法:通过类型类或类型族。

我熟悉类型类,因此实现了 MyEq:

class MyEq a where 
eq :: a -> a -> Bool

但是,当我尝试定义类型族版本时,它无法编译:

data Defined = Yes | No

type family IsEq (a :: *) :: Defined

由于:

TypeEq.hs:30:30: error:
• Type constructor ‘Defined’ cannot be used here
(Perhaps you intended to use DataKinds)
• In the kind ‘Defined’

请解释如何实现 Eq 类型类的 type family 版本。另外,请展示此类类型系列实例的实现(如果这个词正确的话)会很有帮助。

最佳答案

这有点简洁,很高兴偶然发现了这一点。有兴趣的,here是幻灯片和 here是纸。这是需要一些语言扩展的常见情况。

{-# LANGUAGE DataKinds, TypeFamilies, TypeOperators, ConstraintKinds #-}

data Defined = Yes | No

type family IsEq (a :: *) :: Defined

type Eq a = IsEq a ~ Yes

然后,它的“实​​现”是这样的实例

type instance IsEq () = Yes      -- '()' is an instance of 'Eq'
type instance IsEq Int = Yes -- 'Int' is an instance of 'Eq'
type instance IsEq [a] = IsEq a -- '[a]' is an instance of 'Eq' is 'a' is

您可以在 GHCi 上“尝试”它们:

ghci> :kind! IsEq [Int]
IsEq [Int] :: Defined
= Yes

但是纸张和幻灯片实际上并不太担心实际提供相等函数。 (它提到将其存储在 Yes 字段中)。那么,如果它甚至没有准备好提供类方法,为什么这很有趣呢?因为

  • 它提供了比重叠类更好的机制
  • 回溯搜索比类型类更容易
  • 它使得提前失败成为可能,并显示漂亮的错误消息(编码为 No 构造函数中的字段)

关于haskell - `Eq` 的类型系列等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882725/

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