我可以在 GHCi 中添加实例声明吗

发布于 2024-12-21 12:27:29 字数 458 浏览 3 评论 0原文

我正在摆弄 HashMap 并尝试使用 Data.Bson.ObjectId 作为键。当然,我发现该结构没有 Hashable 实例。没关系,因为编写一个代码很简单。1

instance Hashable ObjectId where hash (Oid x y) = hash (x,y)

我在 GHCi 中输入了这一行,并被告知“在输入‘实例’上解析错误”。这实际上是有意义的,因为 GHCi 提示符的运行方式就好像这些行被键入到 IO monad 中的 do 块中,并且无法在此上下文中定义实例。

那么我的问题是,有没有办法在 GHCi 中定义新实例?


1 为什么库不提供这个实例是另一回事。我相信答案是限制依赖关系,除了 bson 包已经依赖于阳光下的一切。

I was messing around with HashMap and tried to use a Data.Bson.ObjectId as a key. I, of course, discovered that there is not a Hashable instance for that structure. That's ok, because writing one is trivial.1

instance Hashable ObjectId where hash (Oid x y) = hash (x,y)

I typed that line into GHCi and was told "parse error on input `instance'". This actually makes sense as the GHCi prompt operates as if the lines were being typed into a do block in the IO monad and an instance can not be defined in this context.

My question then, is there a way to define a new instance within GHCi?


1 Why this instance is not provided by the library is another matter. I would believe the answer was to limit dependencies except that the bson package already depends on everything under the sun.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一身仙ぐ女味 2024-12-28 12:27:29

好消息:是的,有一种方法可以在 GHCi 中定义新实例。

坏消息:目前,这样做的第一步是“安装 GHC 的开发快照”。

很长一段时间以来,这一直是 GHCi 中明显缺失的功能。它的缺席并没有什么内在原因,但我认为实施起来有些困难,所以它被搁置了。

然而,似乎从版本 7.4.1 开始,现在可用

在 GHCi 提示符下,您还可以输入任何顶级 Haskell 声明,包括数据、类型、newtype、类、实例、派生和外部声明。例如:

前奏>数据 T = A |乙| C 导出(Eq、Ord、Show、Enum)
前奏> [一..]
[A、B、C]
前奏> :它
数据 T = A |乙| C -- 定义于 :2:6
实例枚举 T -- 定义于 :2:45
实例 Eq T -- 定义于 :2:30
实例 Ord T -- 定义于 :2:34
实例 Show T -- 定义于 :2:39

您是否认为现在值得安装 GHC 的非发行版本,这取决于您。

The good news: Yes, there is a way to define a new instance within GHCi.

The bad news: At the moment, the first step in doing so is "install a development snapshot of GHC".

This has been an obvious bit of missing functionality in GHCi for quite a while. There was no inherent reason for it to be absent, but I assume it was somewhat difficult to implement and so it got set aside.

However, it seems that as of version 7.4.1, it's now available:

At the GHCi prompt you can also enter any top-level Haskell declaration, including data, type, newtype, class, instance, deriving, and foreign declarations. For example:

Prelude> data T = A | B | C deriving (Eq, Ord, Show, Enum)
Prelude> [A ..]
[A,B,C]
Prelude> :i T
data T = A | B | C      -- Defined at <interactive>:2:6
instance Enum T -- Defined at <interactive>:2:45
instance Eq T -- Defined at <interactive>:2:30
instance Ord T -- Defined at <interactive>:2:34
instance Show T -- Defined at <interactive>:2:39

Whether you think having that right now worth the hassle of installing a non-release version of GHC is up to you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文