问题标签 [overlapping-instances]

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 投票
1 回答
793 浏览

haskell - 泛化加法时的 GHC 重叠实例

试图推广(+)到不仅仅是Nums,我写了一个Addable类:

当尝试添加(连接)列表时,GHC 抱怨重叠实例:

我知道 GHC 在选择类型类的实例时会忽略上下文,因此尝试在Addable [a] 和之间进行选择Addable a确实是一个问题。但是,我希望 GHC 选择第一个定义,因为它更具体。为什么没有发生这种情况?

此外,这个问题是否有一个优雅的解决方法?还是我从错误的角度来看这个?

0 投票
1 回答
422 浏览

haskell - 如何为我自己的类型类中的所有类型声明类型类的实例(如 Show)?

我有一个类型类:

它看起来不是很有用,但我用它来强烈(不仅仅是type同义词)区分语义上不同的Map String Ints 变体:

并且仍然具有可在任何类型的类上运行的功能。

  1. 有没有更好的方法来进行这种区分(可能没有Wrapper实例样板)?

我想做这个:

而不是编写许多样板Show实例。

通过FlexibleInstancesand UndecidableInstances,GHC 让我认为我的实例声明适用于所有内容,因为据称它与Show我的代码和GHC.Show. HaskellWiki 和 StackOverflow 的回答者和 HaskellWiki 说服我OverlappingInstances不是很安全,而且可能令人困惑。GHC 甚至不建议这样做。

  1. 为什么 GHC 首先抱怨不知道Show Int选择哪个 fx 实例(那么为什么它不查看我在编译时给出的约束?)然后,被告知实例可能重叠,突然知道该怎么做?

  2. 我可以避免OverlappingInstances使用我newtype的 s 吗?

0 投票
1 回答
87 浏览

haskell - Haskell/GHC:报告的重叠实例,而上下文只允许一个实例

亲爱的 Haskell/GHC 专家,

我真的不明白为什么 GHC 报告重叠实例,而根据提供的上下文只有一个实际上是有效的。例如,让我们考虑以下代码:

编译它给出:

关键是它('a', True)的类型(Char, Bool)不是C. 因此,instance C a => C [a]不适用于 value [('a', True)]

所以,GHC为什么会考虑呢?

问题实际上是关于理解 GHC 的行为,而不是关于如何避免这个问题(例如使用OverlappingInstances)。是因为“解析”函数调用时不使用上下文吗?如果是这样,为什么?

提前致谢!

0 投票
1 回答
260 浏览

haskell - 意外的重叠实例错误

我有以下代码。Class1实例说明一个类的直接超类是什么,SuperClass1自动遍历Class1查找所有超类。(我省略了这些类的实际方法,因为它们与我的问题无关。)

这很好用!现在我想像这样使用它:

(即我可以给出一个 for 的实例,Functor只要Hfree c fFunctor的超类c。)

这在 Applicative 实例中给出了这个错误(与 Monad 实例类似):

据我了解,Applicative 实例需要 Functor 实例,所以 Applicative 实例也需要SuperClass1 Functor cFunctor 的约束。事实上,如果我添加这个,错误就会消失。(这是我目前拥有的:http: //hackage.haskell.org/package/free-functors-0.7/docs/Data-Functor-HFree.html

但不知何故,GHC 足够聪明,可以理解这SuperClass1 Applicative c意味着SuperClass1 Functor c,因为它不会抱怨缺少约束。相反,它会卡在重叠实例错误上。如果有办法修复错误,那就太好了,但我不知道怎么做!

0 投票
1 回答
60 浏览

haskell - 如果缺少约束,GHC 使用包罗万象的实例?

我一直在试验这个简单的 HLists 实现和一个如果 an是列表成员则hasInt返回的函数:TrueInt

这没有给出预期的结果。但是,如果我改变它似乎确实有效:

到:

另一方面,如果我使用类型类函数但不包含约束,我通常希望 GHC 会抱怨,并且在这种情况下我没有得到任何此类指示。

显然,它必须与 catch-all instance 做一些事情IsInt a。如果我将Could not deduce (IsInt a) arising from a use of 'isInt' catch-all 实例替换为:

我的问题是:这是 GHC 的预期行为 - 如果没有明确的类型类约束,它会默默地使用一个包罗万象的实例吗?

0 投票
1 回答
229 浏览

haskell - 这两个实例如何重叠(涉及超出范围的类型)

几天前,我问了一个关于在自由单子的上下文中注入函子的问题。那里建议的解决方案基于Data Types à la Carte使用一个表示函子之间的一种包含关系的类。

现在考虑以下数据类型:

以及具有以下类型的函数

从哪里来FreeControl.Monad.Free模块。

然后,如果我尝试按如下方式使用此功能:

我收到一个重叠实例错误,说:

现在,我知道第一个是有效实例,但为什么第二个也被视为有效实例?如果我在第二种情况下实例化变量,我会得到

这不应该是一个实例,因为WeatherServiceF :-<: StorageF. 为什么 GHC 会推断出这样的例子?

我启用了以下实例:

0 投票
1 回答
76 浏览

haskell - 在不遇到重叠实例的情况下定义增量环境

如何定义一个我们可以添加“功能”而不会遇到重叠实例的环境?

假设我们有以下数据类型和类型类:

现在我们想定义几个需要环境中某些成分的函数:

我们定义了一些实例Has*

最后,我们想定义一个准备冰沙和沙拉的函数:

现在第一个问题是,将什么作为成分传递给上面定义的实例可以使用?我的第一个解决方案是使用元组:

这虽然很麻烦,但很有效。但是现在假设我们决定添加一个mkStew,这需要一些HasMeat实例。然后我们必须更改上面的所有实例。此外,如果我们想单独使用mkSmothie,我们不能直接通过([Orange], [Cucumber]),因为没有为它定义实例。

我可以定义:

和实例:

但是以下方法不起作用(没有实例HasVegetable [Legume]):

而且这个实例会重叠!

有没有办法以优雅的方式解决这个问题?

0 投票
0 回答
108 浏览

haskell - 在 GHC-8.2.2 中,重叠实例解析能否取决于文件是否作为暴露模块包含在内?

我遇到了以下来自 GHC-8.2.2 的难以理解的行为

我有一些重叠的类型类实例。没有不连贯的类型类实例。大致有一个表单的特定类型类实例,

whereC有重叠的实例。当我将我的项目加载到stack repl中时,一切都很好。这个实例的上下文被解析为C我正在寻找的实例。

如果我创建一个test.hs导入属于上述实例的数据类型的文件,那么一切都不好。当我将它加载到stack repl中并调用 的操作时D1,很明显实例的上下文D1被解析为 的“错误”实例C

特别奇怪的是,如果我将test.hs其作为暴露模块添加到我的项目中,然后在没有其他更改的情况下将其重新加载到 repl 中,那么上面实例的上下文将解析为C.

我看不到 GHC-7.10.3、8.0.1、8.0.2 或 8.4.3 的这种行为。也许这与这个错误有关?

但是我没有使用不连贯的实例,这就是那个错误似乎涉及的内容。我在发生上述实例的模块中使用了大量语言扩展:

我还没有一个最小的例子。可以在GHC-Repro中找到该行为的最小示例。跑test.sh看现象。我想知道的是:

  1. 这是否可能是 GHC 的预期行为,我只是做错了什么。
  2. 如果我做错了什么,在将项目中的内容导入其他项目时,我可能会做些什么来选择“正确”的实例。

现在正在跟踪此问题:https ://ghc.haskell.org/trac/ghc/ticket/15599

0 投票
1 回答
141 浏览

haskell - 通过 Nat-kind 重叠实例

这个问题实际上是由于尝试将几个数学组实现为类型而出现的。

循环组没有问题(在Data.Group别处定义的实例):

但是对称群在定义一些实例时存在一些问题(通过阶乘系统实现):

来自 ghci 的错误消息(仅简短):

那么GHC如何知道是否n-1等于1呢?我还想知道解决方案是否可以在没有FlexibleInstances.

0 投票
1 回答
261 浏览

haskell - Haskell 中依赖于类型变量的默认方法实现

我正在尝试定义默认方法实现,但前提是类的类型变量派生某些其他类。

我曾尝试使用=>(我什至正确使用它吗?)创建依赖于类型的实例,但我得到一个“重复的实例声明错误”:(https://repl.it/@solly_ucko/Distributions

然后当我尝试添加真实实例(并注释掉我之前创建的一些“实例”以便编译器可以达到那个点)时,它给了我一个关于冲突实例的错误。

澄清一下,我的目标是 for probabilityand valuesto be defined for all Distributions,以及 for probabilityOfRangeto be defined for all Distributionswith values deriving Ord。我还希望在满足其他约束时提供默认值,因为没有它们,合理的默认值(基于其他方法)是不可能的。