haskell - 使基本 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)的两个类型类的实例时,我遇到了问题。
通过阅读这个问题,我现在担心我所要求的只是被禁止......
解决方案
为了给出一个具体的解决方案,这样的事情就可以工作,而不必处理与 (+) 的冲突:
class Foo a where
(<+>) :: a -> a -> a
infixl 6 <+>
instance Foo Integer where
(<+>) = (+)
现在你的类 Foo 有它自己的操作符,并且固定性声明意味着 (<+>) 将被解析为与 (+) 相同的方式。
推荐阅读
- ruby-on-rails - rails盲索引gem raw sql查询不起作用
- javascript - 如何在反应导航 5 中替换切换导航器?
- python - 如何在 Python 中与 Flask 并行运行其他代码
- assembly - 无法调整大小说明
- excel - 如何在Excel中查找范围内的值
- lua - 为什么我的强化道具没有出现在我的 LOVE2D 游戏中?
- string - 在 powershell 中,在匹配的模式前面添加一个变量
- azure - Azure 管道:是否必须在同一分支中拥有 azure 管道和代码
- azure - 如何从 Prometheus 服务器中的 Azure app-insight 获取自定义指标?
- python - 将两个变量放在这样的 if 语句中是什么意思:variable[variable2]?