问题标签 [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.
haskell - 避免在 Haskell 中重复实例声明
我的问题似乎与这个密切相关 。
我的代码解析一个 yaml 文件,重新排列对象并编写一个新的 yaml 文件。它工作得很好,但其中有一个特别丑陋的部分。
我必须将我的数据结构声明为这样的FromJson
实例ToJson
:
问题是我必须在其他 8 个左右的情况下重复此操作:
我不知道如何避免这种重复。是否有某种方法可以只声明这两个函数一次(例如在一个新类中)并让所有这些数据类型从中派生?
解决方案(另见 dfeuer 接受的答案):
我个人喜欢这个解决方案。您需要添加
然后你可以像这样声明类型:
haskell - 量化约束与(封闭)类型族
我正在尝试使用这篇博文的方法来处理更高种类的数据,而不会将普通情况下Identity
的函子与量化约束推导一起使用:
这会导致令人发指的自相矛盾的错误消息:
无法
Show (HKD f a)
从上下文推断:forall a. Show a => Show (HKD f a)
有没有一种方法可以做到这一点,而不需要冗长而做
?
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
这是不可能的?如果是后者,这是否意味着也无法创建一个允许自动派生任何类型的库,因为我找不到这样的库。Unbox
Storable
Unbox
Storable
我问是因为理想情况下我想避免使用模板 Haskell 和使用vector-th-unbox
.
haskell - 编码单子变换器的选择
有时可能需要动态地截取或改变一元效应的行为。为了使事情具体化,让我们假设一个允许声明成本中心的效果:
一种可能的实现为成本中心的每个开始/完成事件生成日志行:
另一种可能性是收集数据结构中的所有时间以供以后处理:
假设我们的应用程序是一个 Web 服务,它不关心收集时间,除非正在处理的请求明确要求。我们的代码将如下所示:
但是类型是什么CostCenterT
?我们不是说这取决于要求吗?是的,我们希望根据请求以不同方式处理成本中心,但是 Haskell 类型系统要求运营商 HandlerMonad
的类型是固定的。这种选择可以使用Either
基于载体的显式编码:
其余EitherT
样板文件(实例、运行函数)并不漂亮,留给读者作为练习。有没有更好的办法?
效果解释器
上述问题不适用于一些没有明确载体的效果系统,如多义词。具有显式载体(如融合效果
和变压器)的效果系统可以通过定义变压器来解决此问题Interpreter
。实际上,融合效果包括 monadControl.Effect.Interpret.InterpretC s sig
转换器,可用于拦截sig
由底层 monad 实现的效果m
。
我们可以为 vanilla转换器定义一个类似的抽象,如下所示:
现在我们可以定义HandlerMonad
和runHandler
如下:
动态效果解释器
上面的解决方案适用于简单的动态,但有时我们想在计算中更改或扩展解释器。就像是:
这几乎是有用的,除了没有实际的方法可以委托给以前的解释器。它只允许覆盖:
为了启用委托,我们必须求助于另一个 monad 转换器:
现在我们几乎可以写出下面的函数了:
但是它失败并出现下面的类型错误,其中instance MonadCostCenter CollectTimingsT
引入了MonadTime
约束,并且 GHC 要求提供委托解释器提供它的证据。我们知道它确实如此,因为它满足MonadCostCenterTime
which includes MonadTime
,但由于某种原因,检查的类型不接受这个。
haskell - 在 newtype 中包装一个类型
在下面的代码中,我收到了警告Orphan instance: instance (MonadIO m, Monad m) => GenerateUUID m
根据它,解决方案是
(或禁用警告帽子互联网也建议)
我的问题是我无法找到如何用新类型包装类型?
haskell - 新类型的 Haskell Monoid 实例问题
我正在尝试定义一个实例:
目标是如果列表中的所有函数都为真,则函数 foldMap Join 应该返回 True,如果所有函数都不为真,则返回 false。
我了解 foldMap,以及 Monoid 的 Sum 和 Product 的实例,但是对于编写 Monoid 的新类型实例来说还是很陌生的。任何正确方向的帮助将不胜感激。谢谢你。
haskell - 这个“派生新类型”的语法是什么?
从我读到的一篇博文
那是什么deriving newtype
语法?它是哪个扩展名,它有什么作用?请在 anwser 中提供指向其文档的链接。
haskell - 为包含不能具有 Eq 或 Show 的字段的 ADT 派生 Eq 和 Show
我希望能够派生Eq
并Show
用于包含多个字段的 ADT。其中之一是函数字段。这样做时Show
,我希望它显示一些虚假的东西,例如"<function>"
;这样做时Eq
,我希望它忽略该字段。Show
如果不为and手写完整的实例,我怎样才能最好地做到这一点Eq
?
我不想将函数字段包装在 a 中newtype
并编写我自己的Eq
并且Show
为此 - 那样使用太麻烦了。
haskell - 如何将 DerivingVia 与 Arbitrary 结合使用
我需要为新类型编写大量任意实例。我试图通过 GHC 扩展来减少打字和使用派生。
我的用例符合要求,但在运行时崩溃了!GHCi 是 8.8.4
显示工作正常,但任意没有!
haskell - 定义新的 monad 实例
几天前,我试图通过创建一个新的 monad 实例来证明 monad 定律,但我发现自己陷入了定义新的 monad 实例的困境。
我在 list monad 定义之后尝试了一些东西,但是因为 concat 需要 [[a]] 但在这里它得到 [Test b] ,所以可能有其他可用的函数,或者有没有办法让 concat 在 newType 上工作?任何建议表示赞赏。谢谢。