【发布时间】:2023-03-19 02:25:01
【问题描述】:
假设我正在尝试在 Haskell 中定义一个新的类型类,除此之外,它必须有一个 + 操作:
class Foo a where
(+) :: a -> a -> a
(在实践中,类型类 Foo 会有更多的东西,但让我在这里停下来保持最小化。)
现在,我想让基本的“整数”类型成为 Foo 的实例;就 + 操作而言,我只想保留通常的加法,这已经定义了。我该怎么做?
不用说,以下是没有意义的:
instance Foo Integer where
(+) x y = x+y
当我要求 Haskell 计算 2+3 时,它会永远循环,但我想这是意料之中的!我也试过什么都不放:
instance Foo Integer
这可以编译,但是当我要求 2+3 时,我得到“没有实例,也没有类操作的默认方法 +”。再一次,它是有道理的......
那么我们该怎么做呢?
我猜这是“关于命名空间”的一般问题,我的意思是,当两个类型类使用相同的名称时,会发生什么?在我的例子中,当我试图将一个类型(整数)作为具有这种名称冲突(Num 和 Foo)的两个类型类的实例时遇到问题。
从阅读this question开始,我现在担心我所要求的只是被禁止...
【问题讨论】:
-
对,我想你找错树了。正如您所提到的——您可以“导入合格的 Prelude”并将每个添加符号写为
Prelude.+,但这似乎......非常不必要。为什么Foo必须使用+运算符?如果您只是将其更改为独特的东西,那么所有这些疯狂都会消失:) -
@Adam:举一个非常数学的例子(但我毕竟是一个工作的数学家......),你可以想象 Foo 真的被称为 AbelianGroup,这样一个类型的元素这个类的个数可以相加,但不能相乘,所以它们不属于 Num。然而使用 + 而不是其他符号是很自然的......而“整数”类型的元素当然是示例。
-
PS 你可以将我的问题改写为:你如何定义一个弱版本的 Num 或任何类型类,其中一些函数没有定义?
-
有hackage.haskell.org/package/groups-0.4.1.0/docs/Data-Group.html,它在幺半群之上建立组和阿贝尔组,使用操作符。此外 - Num 没有超类(它不需要 Show 或 Eq)
-
从haskell.org/onlinereport/basic.html#numbers 中的图 6 我推断出 Num 需要 Eq 和 Show...?
标签: haskell