haskell - 使基本 Haskell 类型成为新类型类的实例

标签 haskell

假设我正在尝试在 Haskell 中定义一个新的类型类,除其他外,它必须有一个 + 操作:

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

(实际上,类型类 Foo 会有更多内容,但让我在这里停下来保持最小化。)

现在,我想让基本的“Integer”类型成为 Foo 的实例;至于 + 操作,我只想保留通常的加法,它已经定义了。我该怎么做?

不用说,以下内容毫无意义:

instance Foo Integer where
    (+) x y = x+y

当我要求 Haskell 计算 2+3 时,它会永远循环,但我认为这是可以预料的!我也尝试过什么都不放:

instance Foo Integer

这可以编译,但是当我要求 2+3 时,我得到“没有实例,也没有类操作的默认方法+”。再说一遍,这是有道理的......

但是我们该怎么做呢?

我想这是一个“关于命名空间”的普遍问题,我的意思是,当两个类型类使用相同的名称时,会发生什么?就我而言,当我尝试将一个类型(Integer)创建为具有此类名称冲突(Num 和 Foo)的两个类型类的实例时,我会遇到问题。

来自阅读this question ,我现在恐怕我所要求的只是被禁止的......

最佳答案

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

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

infixl 6 <+>

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

现在你的类 Foo 有了自己的运算符,固定性声明意味着 (<+>) 将以与 (+) 相同的方式进行解析。

关于haskell - 使基本 Haskell 类型成为新类型类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989707/

相关文章:

haskell - 重载函数签名 haskell

haskell - 为什么会出现 “No instance for (Fractional a0) …”错误?

haskell - 来自实例的约束推断

haskell - 将 IO 输出收集到列表中

haskell - 编译器优化后如何分析 Haskell?

list - 从 Haskell 列表中删除第一个和最后一个元素

haskell - `([] ==) []`的类型如何推断haskell?

haskell - 如何指定 GHC 应该使用哪些 LLVM 二进制文件?

haskell - 在 Haskell 中处理大数

haskell - 堆栈找不到它应该可以找到的本地模块