问题标签 [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 中使用类型的派生 Generic 实例从有限离散类型的值到 (Finite n) 并返回?
我有一个库,目前要求用户提供具有以下类型的辅助函数:
以便库实现可以使用具有以下类型的函数的非常有效的大小向量表示:
(MyType
是离散的和有限的。)
假设派生一个Generic
实例MyType
是可能的,有没有办法tEnum
自动生成,从而减轻我图书馆用户的负担?
我也想走另一条路;也就是说,自动推导出:
haskell - 为什么我们不能在 Haskell 中为枚举派生 Random 类实例?
我今天写了这个:
而且我认为这对于任何枚举来说都是大致可复制粘贴的。我尝试将 Random 放入派生子句中,但失败了。
然后我在网上搜索并发现了这个:
请为 Random #21 提供 (Enum a, Bounded a) 的实例
几句话似乎回答了我的问题,但我不太明白:
您想到什么实例,实例 (Bounded a, Enum a) => Random a where ...?不可能有这样的实例,因为它会与其他所有实例重叠。
这将阻止任何用户派生的实例。...
为什么不能通过派生子句或至少使用默认实现来自动化。
为什么这行不通?
haskell - 使用新的派生功能扩展 GHC 的最简单方法是什么?
我想教 GHC 派生新的类型类。是否可以在不使用Generic
或 TemplateHaskell 的情况下在外部执行此操作?就像,使用源插件或类似的东西。所以我可以写:
更新:与讨论相关的 GHC 票证:
haskell - 从带有变压器堆栈的新类型派生 MonadFree
我试图MonadFree
从 a中得出,但newtype
我无法解决。我目前的代码是:
我得到
如果有人有任何建议,将不胜感激。
haskell - Haskell DerivingVia 上的多参数类型类与有趣的 deps
我正在尝试使用DerivingVia
具有功能依赖关系的多参数类型类的实例定义来削减样板文件。
我有这些类型和类:
我想MyEq (Wrapper Int) Wrapper
使用deriving via
.
我的第一次尝试是使用:
正如论文第 6.2 节所讨论的那样,https://www.kosmikus.org/DerivingVia/deriving-via-paper.pdf,这寻找一个MyEq (Wrapper Int) Wrapper2
实例,第二个参数已“更改”但第一个参数仍然是Wrapper Int
.
显然instance MyEq (Wrapper Int) Wrapper2
不存在,因为我实现了instance MyEq (Wrapper2 Int) Wrapper2
.
我不能通过创建来“作弊”(参见Wrapper
第一个类型参数):
因为在这种情况下,Wrapper t -> Wrapper2
不尊重功能依赖性。
我可以通过重写和删除函数依赖来轻松解决这个问题eq :: f a -> f a -> f Bool
,但我想避免更改这个 API。
haskell - 通过独立导出导出
我不确定我在这里做错了什么:
到目前为止,一切正常(Additive 在代数包中定义,但非常不言自明)。
但是,现在我想聪明地使用 DerivingVia 和 StandaloneDeriving,我什至无法编译下一行
但这让我
谁能告诉我我做错了什么?我正在运行 GHC 8.6.2
haskell - 无法为这种类型派生 Generic?
在 GHC 8.6.2 上编译这个简短的片段:
导致此错误:
Generic
不能为这种类型派生吗?为什么?
haskell - Using Deriving Via with Phantom Types
Apologies for the long repro but I haven't been able to make it any shorter. The following code compiles fine until the last line:
After that I get the following error:
- Couldn't match representation of type
Vector2D a
with that ofVia (Phantom2 d a) (Phantom1 d a)
Which seems to be saying it can't coerce "Via &c" to "Vector2D a", which is odd because it's literally a newtype two levels deep and that works fine.
What am I doing wrong here?
haskell - 导出位置显示
注意如何T 5
显示
是否有某种方法可以为使用记录语法声明的类型派生 Show 的位置非记录语法变体?
(顺便说一句T
,这只是解释问题的一个简单示例,我正在寻找使用记录语法定义的任何类型的一般答案)
我会满意的一些选项:
- 图书馆为其提供的第 TH 代
- 基于派生(
Generic
手动实例引用现有函数) - 手动实现
Show
实例的简单方法/指南 - 我没有想到的任何其他想法
对于一个更复杂的例子,我有这个手写的实例:
我希望答案能够避免这个样板。
haskell - 是否可以为我的类型类 Y 提供某些类型类 X 的默认实例?
详细地说,通常可以为类型类实例函数提供默认实现,但我想知道是否也可以为其他类型类的类型类实例提供默认实现。
例如,假设我正在实现类型 classY
并且我希望所有实例a
都Y
满足X a
其他类型 class X
。最初我试图通过写作来做到这一点instance Y a => X a where ...
,但看到这实际上是不可能的(Haskell Constraint 不小于实例头)。但是,与另一个问题中描述的可能有多个类型类约束的更一般情况不同,我的情况下只有一个类约束,所以我认为可能有一种方法可以在课堂上做到这一点定义级别,可能使用 Haskell 语言扩展。
另一个问题中描述的方法似乎不太顺利 - 假设X
实际上是Ord
. Ord
由 some包装可防止在原始类型上newtype
直接使用函数。Ord