问题标签 [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 回答
5612 浏览

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 认为另一个也有呢?

0 投票
3 回答
632 浏览

haskell - 为什么没有 `-XDeriveApplicative` 扩展?

GHC 有几个有用的语言扩展,用于机械地派生各种常见的 Haskell 类型类 ( -XDeriveFunctor, -XDeriveFoldable, -XDeriveTraversable)。似乎这Applicative是另一个经常需要并且经常容易派生的类。对于包含类型插槽的简单记录a,例如,

Applicative实例是平凡派生的,

a即使在一些值隐藏在其他应用函子中的稍微困难的情况下,例如,

一个合理的例子很容易写出来,

为什么-XDeriveApplicative不存在实现这些机械实例的扩展?甚至deriveandgeneric-derive软件包显然也缺乏Applicative支持。是否存在阻止这些实例通常有效的理论问题(除了那些可能也威胁到FunctorFoldableTraversable扩展的原因)?

0 投票
2 回答
158 浏览

haskell - 通过 GeneralizedNewtypeDeriving 派生实例时使用自定义实例

假设我们有一个 typeclass class (A a, B a) => C a where。使用newtype将允许我们克隆数据类型,然后通过GeneralizedNewtypeDeriving语言扩展自动派生实例(请参阅如何编写可派生类?处理具有相同内部表示和最小样板的多种类型?)。

问题:是否有可能让 ghc 自动派生Aand C,但使用我们自己指定的Bin deriving实现C

例如,以下代码(其中A= PlanetB= LivesC= Description)无法按预期工作:

我期待/想要的DolphinLivesDescription.

显然,以下程序可以工作,但它需要一个显式实例化Descriptionfor Dolphin

ps 令人费解的是,如果(在第一个程序中)我没有声明:

然后 ghc 抱怨:

如果 ghc没有在for的(自动)推导中使用它,instance Lives Dolphin where它会抱怨缺少,这似乎很奇怪。DescriptionDolphin

0 投票
2 回答
2549 浏览

haskell - 为什么没有办法在 Haskell 中推导出 Applicative Functor?

Functor在 Haskell 中,您可以派生FoldableTraversable自动使用deriving. 但是,没有办法推导出Applicative。考虑到有一种明显的方式来定义一个Applicative实例(这相当于一个压缩的应用程序),没有任何方法可以启用deriving Applicative吗?

0 投票
3 回答
182 浏览

haskell - 为什么这个表达式有一个有效的类型?

在 中敲打ghci,我碰巧注意到这个表达式(*) 1 [1..5]显然有一个有效的类型。

显然它是一个包含多个类型约束的列表,包括Num [t]对我来说看起来不可能的,就像它应该给出一个错误一样。

这是表达式的类型?为什么ghci's:t命令在这里没有给出错误?

0 投票
1 回答
483 浏览

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。

0 投票
1 回答
1956 浏览

haskell - 通过独立导出导出

我不确定我在这里做错了什么:

到目前为止,一切正常(Additive 在代数包中定义,但非常不言自明)。

但是,现在我想聪明地使用 DerivingVia 和 StandaloneDeriving,我什至无法编译下一行

但这让我

谁能告诉我我做错了什么?我正在运行 GHC 8.6.2

0 投票
1 回答
66 浏览

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 of Via (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?

0 投票
2 回答
210 浏览

haskell - 似乎不重叠的重叠实例

考虑以下(接近最小)示例:

看着test $ Baz Bar,您会期望得到 的结果False,因为我们有实例Predicate BarPredicate a => Predicate (Baz a)

但是 GHC 8.6.3 和 8.0.1 都拒绝这个:

然而没有重叠:我们可以Traversable Baz通过注释掉实例来确认没有Predicate (Baz a)实例,在这种情况下我们会得到错误:

我假设这是一个限制FlexibleInstances?如果是这样,为什么,是否有批准的解决方法?


好的,事实证明这是 GHC 决定使用哪个实例而不受实例约束的结果,如此所述。不过,这个技巧在这里似乎不起作用:

给出一个Duplicate instance declarations错误,所以我将这个问题留给在这种情况下有效的解决方案。

0 投票
2 回答
435 浏览

haskell - 是否可以为我的类型类 Y 提供某些类型类 X 的默认实例?

详细地说,通常可以为类型类实例函数提供默认实现,但我想知道是否也可以为其他类型类的类型类实例提供默认实现。

例如,假设我正在实现类型 classY并且我希望所有实例aY满足X a其他类型 class X。最初我试图通过写作来做到这一点instance Y a => X a where ...,但看到这实际上是不可能的(Haskell Constraint 不小于实例头)。但是,与另一个问题中描述的可能有多个类型类约束的更一般情况不同,我的情况下只有一个类约束,所以我认为可能有一种方法可以在课堂上做到这一点定义级别,可能使用 Haskell 语言扩展。

另一个问题中描述的方法似乎不太顺利 - 假设X实际上是Ord. Ord由 some包装可防止在原始类型上newtype直接使用函数。Ord