问题标签 [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:重叠实例
考虑以下示例程序:
它只能使用get
而不是lift get
因为instance MonadState s m => MonadState s (MaybeT m)
在 MaybeT 模块中定义。
许多这样的实例以组合爆炸的方式定义。
如果我们有以下类型类,那就太好了(尽管不可能?为什么?):
让我们尝试这样定义它:
使用lifts $ print i
而不是liftIO $ print i
工作,这很好。
但是使用lifts (get :: StateT Int IO Int)
而(get :: MaybeT (StateT Int IO) Int)
不是不起作用。
GHC (6.10.3) 给出以下错误:
我明白为什么“ instance SuperMonad a a
”适用。但为什么 GHC 认为另一个也有呢?
haskell - 为什么没有 `-XDeriveApplicative` 扩展?
GHC 有几个有用的语言扩展,用于机械地派生各种常见的 Haskell 类型类 ( -XDeriveFunctor
, -XDeriveFoldable
, -XDeriveTraversable
)。似乎这Applicative
是另一个经常需要并且经常容易派生的类。对于包含类型插槽的简单记录a
,例如,
该Applicative
实例是平凡派生的,
a
即使在一些值隐藏在其他应用函子中的稍微困难的情况下,例如,
一个合理的例子很容易写出来,
为什么-XDeriveApplicative
不存在实现这些机械实例的扩展?甚至derive
andgeneric-derive
软件包显然也缺乏Applicative
支持。是否存在阻止这些实例通常有效的理论问题(除了那些可能也威胁到Functor
、Foldable
或Traversable
扩展的原因)?
haskell - 通过 GeneralizedNewtypeDeriving 派生实例时使用自定义实例
假设我们有一个 typeclass class (A a, B a) => C a where
。使用newtype
将允许我们克隆数据类型,然后通过GeneralizedNewtypeDeriving
语言扩展自动派生实例(请参阅如何编写可派生类?和处理具有相同内部表示和最小样板的多种类型?)。
问题:是否有可能让 ghc 自动派生A
and C
,但使用我们自己指定的B
in deriving实现C
?
例如,以下代码(其中A
= Planet
、B
= Lives
、C
= Description
)无法按预期工作:
我期待/想要的Dolphin
是Lives
在Description
.
显然,以下程序可以工作,但它需要一个显式实例化Description
for Dolphin
:
ps 令人费解的是,如果(在第一个程序中)我没有声明:
然后 ghc 抱怨:
如果 ghc没有在for的(自动)推导中使用它,instance Lives Dolphin where
它会抱怨缺少,这似乎很奇怪。Description
Dolphin
haskell - 为什么没有办法在 Haskell 中推导出 Applicative Functor?
Functor
在 Haskell 中,您可以派生Foldable
并Traversable
自动使用deriving
. 但是,没有办法推导出Applicative
。考虑到有一种明显的方式来定义一个Applicative
实例(这相当于一个压缩的应用程序),没有任何方法可以启用deriving Applicative
吗?
haskell - 为什么这个表达式有一个有效的类型?
在 中敲打ghci
,我碰巧注意到这个表达式(*) 1 [1..5]
显然有一个有效的类型。
显然它是一个包含多个类型约束的列表,包括Num [t]
对我来说看起来不可能的,就像它应该给出一个错误一样。
这是表达式的类型?为什么ghci
's:t
命令在这里没有给出错误?
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 - 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 - 似乎不重叠的重叠实例
考虑以下(接近最小)示例:
看着test $ Baz Bar
,您会期望得到 的结果False
,因为我们有实例Predicate Bar
和Predicate a => Predicate (Baz a)
。
但是 GHC 8.6.3 和 8.0.1 都拒绝这个:
然而没有重叠:我们可以Traversable Baz
通过注释掉实例来确认没有Predicate (Baz a)
实例,在这种情况下我们会得到错误:
我假设这是一个限制FlexibleInstances
?如果是这样,为什么,是否有批准的解决方法?
好的,事实证明这是 GHC 决定使用哪个实例而不受实例约束的结果,如此处所述。不过,这个技巧在这里似乎不起作用:
给出一个Duplicate instance declarations
错误,所以我将这个问题留给在这种情况下有效的解决方案。
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