问题标签 [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.
haskell - 避免在 Haskell 中重复实例声明
我的问题似乎与这个密切相关 。
我的代码解析一个 yaml 文件,重新排列对象并编写一个新的 yaml 文件。它工作得很好,但其中有一个特别丑陋的部分。
我必须将我的数据结构声明为这样的FromJson
实例ToJson
:
问题是我必须在其他 8 个左右的情况下重复此操作:
我不知道如何避免这种重复。是否有某种方法可以只声明这两个函数一次(例如在一个新类中)并让所有这些数据类型从中派生?
解决方案(另见 dfeuer 接受的答案):
我个人喜欢这个解决方案。您需要添加
然后你可以像这样声明类型:
haskell - 如何编写“派生实例”声明?
我正在尝试将加密哈希存储为记录类型中的字段,但编译器抱怨:
这是代码:
如果我编写一个独立的“派生实例”子句如下......
...然后错误变为
谁能帮我理解这个错误以及如何解决它?
haskell - 从记录中的字段派生实例
示例代码:
在这里,我有一些由 实现的类,X
然后是另一个Wrapper
包含X
.
我想通过它的字段Wrapper
派生Sample
实例x
。
我知道我可以通过获取字段并为每个函数自己调用它来做到这一点,如图所示。
是否有一些标志或某种方法可以自动或仅执行一次?
这似乎类似于DerivingVia
and GeneralisedNewtypeDeriving
,但两者似乎newtype
都只针对或强制类型
haskell - 量化约束与(封闭)类型族
我正在尝试使用这篇博文的方法来处理更高种类的数据,而不会将普通情况下Identity
的函子与量化约束推导一起使用:
这会导致令人发指的自相矛盾的错误消息:
无法
Show (HKD f a)
从上下文推断:forall a. Show a => Show (HKD f a)
有没有一种方法可以做到这一点,而不需要冗长而做
?
haskell - DeriveAnyClass 与空实例
假设我有这个类型族,如果传递给它的类型不是记录,它会在编译时引发自定义类型错误:
现在我有了这个类型类,它具有默认实现的方法,但通过添加IsRecord
约束要求类型是记录:
当尝试错误地使用它时,如果我们将它用作具有非记录类型的常规实例,它会成功编译失败:
但是如果我启用-XDeriveAnyClass
并将它添加到派生子句中,这不会编译失败,完全忽略约束:
我知道这会DeriveAnyClass
生成一个空实例声明,这就是我在第一个示例中所做的,但它仍然不会引发错误。这是怎么回事?
我正在使用 GHC 8.6.4
haskell - 派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?
我正在重构一些旧代码,这些代码位于多态但类型类受限的 monad 中:
在旧代码中,应用程序的主要单子是......
...现在将更改为...
在这种情况下,自动推导出以下内容是否安全:
- 单子投掷
- MonadCatch
- MonadMask
- MonadBaseControl
- MonadUliftIO
在不深入 GHC 内部的情况下,当编译器自动派生事物时,开发直觉的最佳方式是什么?
haskell - 如何为具有幻像类型变量的新类型定义 MonadUnliftIO 实例?
相关问题 -派生 MonadThrow、MonadCatch、MonadBaseControl、MonadUnliftIO 等是否安全?- 我已经启用了 -DeriveAnyClass
并GeneralizedNewtypeDeriving
让代码编译,但没有费心查看不祥的警告。现在,我正在运行重构的代码,它引发了运行时错误:
所以,我只删除DeriveAnyClass
并保留GeneralizedNewtypeDeriving
了以下编译错误:
注意:我意识到第一个错误 about>>=
与错误 about 无关MonadUnliftIO
。我已确认关闭>>=
时没有关于丢失的警告。DeriveAnyClass
我想我需要为MonadUnliftIO
自己编写实例,因为编译器可能无法在存在newtype
AND 幻像类型变量的情况下解决这个问题。但是,我只是不知道如何askUnliftIO
为我的类型定义上面给出的。
在最小的代码段尝试 1
list - 如何找出列表类型所属的类?
如何找出列表类型所属的类?
在https://www.haskell.org/onlinereport/haskell2010/haskellch6.html说
数据 [a] = [] | a : [a] 推导 (Eq, Ord)
和
列表是类 Read、Show、Eq、Ord、Monad、Functor 和 MonadPlus 的实例。
为什么上面两个不完全一致?
列表类型是类的实例Foldable
吗?如果是,为什么上面的链接中没有提到?
谢谢。
haskell - 为什么可以用“Just (+)”创造价值?
目前我正在学习 Haskell,并且坚持将类型实例化为类型类。我实际上不明白,为什么可以Maybe a
使用Just (+)
.
这对我来说表现得很奇怪的问题是,Maybe 类型被定义为类型类的实例Eq
(请参阅Haskell 源代码),并且如果您派生一个类型的实例,则该类型的值/数据构造函数的所有字段必须也是类型类的一个实例Eq
(这里)。
考虑到这些知识,以下代码不应是可编译或可执行的,因为函数不是类型类的一部分Eq
:
但 GHCi 实际上执行代码时不会抛出错误消息。如果您然后尝试比较这两个值(这也不应该是可能的),解释器会出现以下错误消息:
如果您创建自己的Maybe a
类型,也会出现此问题。