首页 > 解决方案 > 使基本 Haskell 类型成为新类型类的实例

问题描述

假设我正在尝试在 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)的两个类型类的实例时,我遇到了问题。

通过阅读这个问题,我现在担心我所要求的只是被禁止......

标签: haskell

解决方案


为了给出一个具体的解决方案,这样的事情就可以工作,而不必处理与 (+) 的冲突:

class Foo a where
  (<+>) :: a -> a -> a

infixl 6 <+>

instance Foo Integer where
  (<+>) = (+)

现在你的类 Foo 有它自己的操作符,并且固定性声明意味着 (<+>) 将被解析为与 (+) 相同的方式。


推荐阅读