gpt4 book ai didi

Haskell - 具有两个参数的类型类的翻转参数

转载 作者:行者123 更新时间:2023-12-04 02:28:16 26 4
gpt4 key购买 nike

我有一个多参数类型类,它提供了一个可以交换其参数的函数:

class Swappable a b where
swappable :: a -> b -> Bool

所以如果ab形成Swappable a b,那么ba 应该形成 Swappable b a。为每个普通实例写一个交换的实例是一件苦差事,所以我天真地写了

instance Swappable a b => Swappable b a where
swappable b a = swappable a b

无法编译并出现以下错误:

    • Illegal instance declaration for ‘Swappable b a’
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use FlexibleInstances if you want to disable this.)
• In the instance declaration for ‘Swappable b a’
|
12 | instance Swappable a b => Swappable b a where
| ^^^^^^^^^^^^^

现在,我并不反对打开 FlexibleInstances,但我不明白为什么我首先需要它。那里的所有类型变量都出现一次,并且都是不同的。那么为什么会出现这个错误呢?

最佳答案

All instance types must be of the form (T a1 ... an)

表示你的实例必须是形式

instance Swappable (T a1 .. an) (U b1 .. bn) where ...

其中 TU 是类型构造函数。如果没有这个扩展,你不能只有单个变量 ab 没有顶部的构造函数。

FlexibleInstances 无论如何都是无害的,并且可以说默认情况下应该打开。也许 Haskell 报告的 future 修订版会包含它。

相反,我会更担心重叠。 instance Swappable b a => Swappable a b 将与任何其他实例重叠。它还需要不确定的实例。我不确定您要实现的目标是一个好主意。

关于Haskell - 具有两个参数的类型类的翻转参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51221528/

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