问题标签 [deriving]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
261 浏览

haskell - 避免在 Haskell 中重复实例声明

我的问题似乎与这个密切相关 。

我的代码解析一个 yaml 文件,重新排列对象并编写一个新的 yaml 文件。它工作得很好,但其中有一个特别丑陋的部分。

我必须将我的数据结构声明为这样的FromJson实例ToJson

问题是我必须在其他 8 个左右的情况下重复此操作:

我不知道如何避免这种重复。是否有某种方法可以只声明这两个函数一次(例如在一个新类中)并让所有这些数据类型从中派生?

解决方案(另见 dfeuer 接受的答案):

我个人喜欢这个解决方案。您需要添加

然后你可以像这样声明类型:

0 投票
1 回答
88 浏览

haskell - (Data.Monoid) - Sum 和 Product 同时导出 Bounded 和 Num?

Data.Monoid

我不明白你是如何推导出来NumBoundedSum等等Integer......Float这自然不是(这与包装器Bounded的故事相同)。Product

谢谢!

0 投票
2 回答
98 浏览

haskell - 如何编写“派生实例”声明?

我正在尝试将加密哈希存储为记录类型中的字段,但编译器抱怨:

这是代码:

如果我编写一个独立的“派生实例”子句如下......

...然后错误变为

谁能帮我理解这个错误以及如何解决它?

0 投票
1 回答
129 浏览

haskell - 从记录中的字段派生实例

示例代码:

在这里,我有一些由 实现的类,X然后是另一个Wrapper包含X.

我想通过它的字段Wrapper派生Sample实例x

我知道我可以通过获取字段并为每个函数自己调用它来做到这一点,如图所示。

是否有一些标志或某种方法可以自动或仅执行一次?

这似乎类似于DerivingViaand GeneralisedNewtypeDeriving,但两者似乎newtype都只针对或强制类型

0 投票
2 回答
311 浏览

haskell - 量化约束与(封闭)类型族

我正在尝试使用这篇博文的方法来处理更高种类的数据,而不会将普通情况下Identity的函子与量化约束推导一起使用:

这会导致令人发指的自相矛盾的错误消息:

无法Show (HKD f a) 从上下文推断:forall a. Show a => Show (HKD f a)

有没有一种方法可以做到这一点,而不需要冗长而做

?

0 投票
1 回答
1602 浏览

haskell - DeriveAnyClass 与空实例

假设我有这个类型族,如果传递给它的类型不是记录,它会在编译时引发自定义类型错误:

现在我有了这个类型类,它具有默认实现的方法,但通过添加IsRecord约束要求类型是记录:

当尝试错误地使用它时,如果我们将它用作具有非记录类型的常规实例,它会成功编译失败:

但是如果我启用-XDeriveAnyClass并将它添加到派生子句中,这不会编译失败,完全忽略约束:

我知道这会DeriveAnyClass生成一个空实例声明,这就是我在第一个示例中所做的,但它仍然不会引发错误。这是怎么回事?

我正在使用 GHC 8.6.4

0 投票
1 回答
337 浏览

haskell - 派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?

我正在重构一些旧代码,这些代码位于多态但类型类受限的 monad 中:

在旧代码中,应用程序的主要单子是......

...现在将更改为...

在这种情况下,自动推导出以下内容是否安全:

  • 单子投掷
  • MonadCatch
  • MonadMask
  • MonadBaseControl
  • MonadUliftIO

在不深入 GHC 内部的情况下,当编译器自动派生事物时,开发直觉的最佳方式是什么?

0 投票
2 回答
440 浏览

haskell - 如何为具有幻像类型变量的新类型定义 MonadUnliftIO 实例?

相关问题 -派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?- 我已经启用了 -DeriveAnyClassGeneralizedNewtypeDeriving 让代码编译,但没有费心查看不祥的警告。现在,我正在运行重构的代码,它引发了运行时错误:

所以,我只删除DeriveAnyClass并保留GeneralizedNewtypeDeriving了以下编译错误:

注意:我意识到第一个错误 about>>=与错误 about 无关MonadUnliftIO。我已确认关闭>>=时没有关于丢失的警告。DeriveAnyClass

我想我需要为MonadUnliftIO自己编写实例,因为编译器可能无法在存在newtypeAND 幻像类型变量的情况下解决这个问题。但是,我只是不知道如何askUnliftIO为我的类型定义上面给出的。

在最小的代码段尝试 1

0 投票
1 回答
68 浏览

list - 如何找出列表类型所属的类?

如何找出列表类型所属的类?

https://www.haskell.org/onlinereport/haskell2010/haskellch6.html

数据 [a] = [] | a : [a] 推导 (Eq, Ord)

列表是类 Read、Show、Eq、Ord、Monad、Functor 和 MonadPlus 的实例。

为什么上面两个不完全一致?

列表类型是类的实例Foldable吗?如果是,为什么上面的链接中没有提到?

谢谢。

0 投票
1 回答
110 浏览

haskell - 为什么可以用“Just (+)”创造价值?

目前我正在学习 Haskell,并且坚持将类型实例化为类型类。我实际上不明白,为什么可以Maybe a使用Just (+).

这对我来说表现得很奇怪的问题是,Maybe 类型被定义为类型类的实例Eq(请参阅Haskell 源代码),并且如果您派生一个类型的实例,则该类型的值/数据构造函数的所有字段必须也是类型类的一个实例Eq这里)。

考虑到这些知识,以下代码不应是可编译或可执行的,因为函数不是类型类的一部分Eq

但 GHCi 实际上执行代码时不会抛出错误消息。如果您然后尝试比较这两个值(这也不应该是可能的),解释器会出现以下错误消息:

如果您创建自己的Maybe a类型,也会出现此问题。