问题标签 [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.
haskell - 泛化加法时的 GHC 重叠实例
试图推广(+)
到不仅仅是Num
s,我写了一个Addable
类:
当尝试添加(连接)列表时,GHC 抱怨重叠实例:
我知道 GHC 在选择类型类的实例时会忽略上下文,因此尝试在Addable [a]
和之间进行选择Addable a
确实是一个问题。但是,我希望 GHC 选择第一个定义,因为它更具体。为什么没有发生这种情况?
此外,这个问题是否有一个优雅的解决方法?还是我从错误的角度来看这个?
haskell - 如何为我自己的类型类中的所有类型声明类型类的实例(如 Show)?
我有一个类型类:
它看起来不是很有用,但我用它来强烈(不仅仅是type
同义词)区分语义上不同的Map String Int
s 变体:
并且仍然具有可在任何类型的类上运行的功能。
- 有没有更好的方法来进行这种区分(可能没有
Wrapper
实例样板)?
我想做这个:
而不是编写许多样板Show
实例。
通过FlexibleInstances
and UndecidableInstances
,GHC 让我认为我的实例声明适用于所有内容,因为据称它与Show
我的代码和GHC.Show
. HaskellWiki 和 StackOverflow 的回答者和 HaskellWiki 说服我OverlappingInstances
不是很安全,而且可能令人困惑。GHC 甚至不建议这样做。
为什么 GHC 首先抱怨不知道
Show Int
选择哪个 fx 实例(那么为什么它不查看我在编译时给出的约束?)然后,被告知实例可能重叠,突然知道该怎么做?我可以避免
OverlappingInstances
使用我newtype
的 s 吗?
haskell - Haskell/GHC:报告的重叠实例,而上下文只允许一个实例
亲爱的 Haskell/GHC 专家,
我真的不明白为什么 GHC 报告重叠实例,而根据提供的上下文只有一个实际上是有效的。例如,让我们考虑以下代码:
编译它给出:
关键是它('a', True)
的类型(Char, Bool)
不是C
. 因此,instance C a => C [a]
不适用于 value [('a', True)]
。
所以,GHC为什么会考虑呢?
问题实际上是关于理解 GHC 的行为,而不是关于如何避免这个问题(例如使用OverlappingInstances
)。是因为“解析”函数调用时不使用上下文吗?如果是这样,为什么?
提前致谢!
haskell - 意外的重叠实例错误
我有以下代码。Class1
实例说明一个类的直接超类是什么,SuperClass1
自动遍历Class1
查找所有超类。(我省略了这些类的实际方法,因为它们与我的问题无关。)
这很好用!现在我想像这样使用它:
(即我可以给出一个 for 的实例,Functor
只要Hfree c f
是Functor
的超类c
。)
这在 Applicative 实例中给出了这个错误(与 Monad 实例类似):
据我了解,Applicative 实例需要 Functor 实例,所以 Applicative 实例也需要SuperClass1 Functor c
Functor 的约束。事实上,如果我添加这个,错误就会消失。(这是我目前拥有的:http: //hackage.haskell.org/package/free-functors-0.7/docs/Data-Functor-HFree.html)
但不知何故,GHC 足够聪明,可以理解这SuperClass1 Applicative c
意味着SuperClass1 Functor c
,因为它不会抱怨缺少约束。相反,它会卡在重叠实例错误上。如果有办法修复错误,那就太好了,但我不知道怎么做!
haskell - 如果缺少约束,GHC 使用包罗万象的实例?
我一直在试验这个简单的 HLists 实现和一个如果 an是列表成员则hasInt
返回的函数:True
Int
这没有给出预期的结果。但是,如果我改变它似乎确实有效:
到:
另一方面,如果我使用类型类函数但不包含约束,我通常希望 GHC 会抱怨,并且在这种情况下我没有得到任何此类指示。
显然,它必须与 catch-all instance 做一些事情IsInt a
。如果我将Could not deduce (IsInt a) arising from a use of 'isInt'
catch-all 实例替换为:
我的问题是:这是 GHC 的预期行为 - 如果没有明确的类型类约束,它会默默地使用一个包罗万象的实例吗?
haskell - 这两个实例如何重叠(涉及超出范围的类型)
几天前,我问了一个关于在自由单子的上下文中注入函子的问题。那里建议的解决方案基于Data Types à la Carte使用一个表示函子之间的一种包含关系的类。
现在考虑以下数据类型:
以及具有以下类型的函数
从哪里来Free
的Control.Monad.Free
模块。
然后,如果我尝试按如下方式使用此功能:
我收到一个重叠实例错误,说:
现在,我知道第一个是有效实例,但为什么第二个也被视为有效实例?如果我在第二种情况下实例化变量,我会得到
这不应该是一个实例,因为WeatherServiceF :-<: StorageF
. 为什么 GHC 会推断出这样的例子?
我启用了以下实例:
haskell - 在不遇到重叠实例的情况下定义增量环境
如何定义一个我们可以添加“功能”而不会遇到重叠实例的环境?
假设我们有以下数据类型和类型类:
现在我们想定义几个需要环境中某些成分的函数:
我们定义了一些实例Has*
:
最后,我们想定义一个准备冰沙和沙拉的函数:
现在第一个问题是,将什么作为成分传递给上面定义的实例可以使用?我的第一个解决方案是使用元组:
这虽然很麻烦,但很有效。但是现在假设我们决定添加一个mkStew
,这需要一些HasMeat
实例。然后我们必须更改上面的所有实例。此外,如果我们想单独使用mkSmothie
,我们不能直接通过([Orange], [Cucumber])
,因为没有为它定义实例。
我可以定义:
和实例:
但是以下方法不起作用(没有实例HasVegetable [Legume]
):
而且这个实例会重叠!
有没有办法以优雅的方式解决这个问题?
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
看现象。我想知道的是:
- 这是否可能是 GHC 的预期行为,我只是做错了什么。
- 如果我做错了什么,在将项目中的内容导入其他项目时,我可能会做些什么来选择“正确”的实例。
haskell - 通过 Nat-kind 重叠实例
这个问题实际上是由于尝试将几个数学组实现为类型而出现的。
循环组没有问题(在Data.Group
别处定义的实例):
但是对称群在定义一些实例时存在一些问题(通过阶乘系统实现):
来自 ghci 的错误消息(仅简短):
那么GHC如何知道是否n-1
等于1呢?我还想知道解决方案是否可以在没有FlexibleInstances
.
haskell - Haskell 中依赖于类型变量的默认方法实现
我正在尝试定义默认方法实现,但前提是类的类型变量派生某些其他类。
我曾尝试使用=>
(我什至正确使用它吗?)创建依赖于类型的实例,但我得到一个“重复的实例声明错误”:(https://repl.it/@solly_ucko/Distributions)
然后当我尝试添加真实实例(并注释掉我之前创建的一些“实例”以便编译器可以达到那个点)时,它给了我一个关于冲突实例的错误。
澄清一下,我的目标是 for probability
and values
to be defined for all Distributions
,以及 for probabilityOfRange
to be defined for all Distributions
with values deriving Ord
。我还希望在满足其他约束时提供默认值,因为没有它们,合理的默认值(基于其他方法)是不可能的。