问题标签 [derivingvia]

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 投票
2 回答
311 浏览

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

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

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

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

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

?

0 投票
1 回答
287 浏览

haskell - 是否可以通过 GHC 的通用派生来派生 Data.Vector.Unbox ?

可以Storable通过 GHC 的通用派生机制进行派生:http: //hackage.haskell.org/package/derive-storable(以及https://hackage.haskell.org/package/derive-storable-plugin以获得性能)。但是,我可以找到的唯一用于派生的库Data.Vector.Unbox使用模板 Haskell:http ://hackage.haskell.org/package/vector-th-unbox 。它还需要用户编写一些代码;它不是完全自动的。

我的问题是,类似的库是否deriving-storable也存在,或者由于某些基本方式与 不同,Unbox这是不可能的?如果是后者,这是否意味着也无法创建一个允许自动派生任何类型的库,因为我找不到这样的库。UnboxStorableUnboxStorable

我问是因为理想情况下我想避免使用模板 Haskell 和使用vector-th-unbox.

0 投票
1 回答
77 浏览

haskell - 编码单子变换器的选择

有时可能需要动态地截取或改变一元效应的行为。为了使事情具体化,让我们假设一个允许声明成本中心的效果:

一种可能的实现为成本中心的每个开始/完成事件生成日志行:

另一种可能性是收集数据结构中的所有时间以供以后处理:

假设我们的应用程序是一个 Web 服务,它不关心收集时间,除非正在处理的请求明确要求。我们的代码将如下所示:

但是类型是什么CostCenterT?我们不是说这取决于要求吗?是的,我们希望根据请求以不同方式处理成本中心,但是 Haskell 类型系统要求运营商 HandlerMonad的类型是固定的。这种选择可以使用Either基于载体的显式编码:

其余EitherT样板文件(实例、运行函数)并不漂亮,留给读者作为练习。有没有更好的办法?

效果解释器

上述问题不适用于一些没有明确载体的效果系统,如多义词。具有显式载体(如融合效果变压器)的效果系统可以通过定义变压器来解决此问题Interpreter。实际上,融合效果包括 monadControl.Effect.Interpret.InterpretC s sig 转换器,可用于拦截sig由底层 monad 实现的效果m

我们可以为 vanilla转换器定义一个类似的抽象,如下所示:

现在我们可以定义HandlerMonadrunHandler如下:

动态效果解释器

上面的解决方案适用于简单的动态,但有时我们想在计算中更改或扩展解释。就像是:

这几乎是有用的,除了没有实际的方法可以委托给以前的解释器。它只允许覆盖:

为了启用委托,我们必须求助于另一个 monad 转换器:

现在我们几乎可以写出下面的函数了:

但是它失败并出现下面的类型错误,其中instance MonadCostCenter CollectTimingsT 引入了MonadTime约束,并且 GHC 要求提供委托解释器提供它的证据。我们知道它确实如此,因为它满足MonadCostCenterTimewhich includes MonadTime,但由于某种原因,检查的类型不接受这个。

0 投票
1 回答
237 浏览

haskell - 在 newtype 中包装一个类型

在下面的代码中,我收到了警告Orphan instance: instance (MonadIO m, Monad m) => GenerateUUID m

根据它,解决方案是

(或禁用警告帽子互联网也建议)

我的问题是我无法找到如何用新类型包装类型?

0 投票
2 回答
514 浏览

haskell - 新类型的 Haskell Monoid 实例问题

我正在尝试定义一个实例:

目标是如果列表中的所有函数都为真,则函数 foldMap Join 应该返回 True,如果所有函数都不为真,则返回 false。

我了解 foldMap,以及 Monoid 的 Sum 和 Product 的实例,但是对于编写 Monoid 的新类型实例来说还是很陌生的。任何正确方向的帮助将不胜感激。谢谢你。

0 投票
1 回答
96 浏览

haskell - 这个“派生新类型”的语法是什么?

从我读到的一篇博文

那是什么deriving newtype语法?它是哪个扩展名,它有什么作用?请在 anwser 中提供指向其文档的链接。

0 投票
4 回答
152 浏览

haskell - 为包含不能具有 Eq 或 Show 的字段的 ADT 派生 Eq 和 Show

我希望能够派生EqShow用于包含多个字段的 ADT。其中之一是函数字段。这样做时Show,我希望它显示一些虚假的东西,例如"<function>";这样做时Eq,我希望它忽略该字段。Show如果不为and手写完整的实例,我怎样才能最好地做到这一点Eq

我不想将函数字段包装在 a 中newtype并编写我自己的Eq并且Show为此 - 那样使用太麻烦了。

0 投票
0 回答
78 浏览

haskell - 如何将 DerivingVia 与 Arbitrary 结合使用

我需要为新类型编写大量任意实例。我试图通过 GHC 扩展来减少打字和使用派生。

我的用例符合要求,但在运行时崩溃了!GHCi 是 8.8.4

显示工作正常,但任意没有!

0 投票
2 回答
105 浏览

haskell - 定义新的 monad 实例

几天前,我试图通过创建一个新的 monad 实例来证明 monad 定律,但我发现自己陷入了定义新的 monad 实例的困境。

我在 list monad 定义之后尝试了一些东西,但是因为 concat 需要 [[a]] 但在这里它得到 [Test b] ,所以可能有其他可用的函数,或者有没有办法让 concat 在 newType 上工作?任何建议表示赞赏。谢谢。