问题标签 [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.
python - 没有实例共享变量的复合和层次结构
我写了一大段严重依赖继承和组合的代码。现在我遇到了一个问题,我的层次结构类需要共享变量才能在彼此之间工作,但这会导致复合类也被共享,这意味着这些类的单独实例将在我不想要的地方共享值他们到。我显然不擅长用文字来解释这一点,所以我写了一些代码。
除了转储层次系统并编写一个庞大的类,我可以防止复合类共享其有价值的类,还有其他方法可以解决这个问题吗?
haskell - 尝试编写回退实例时出现重叠实例错误
我正在尝试做类似于高级重叠技巧的事情来定义具有重叠行为的实例。我正在尝试为一个元组派生一个实例,如果存在,它将使用该fst
字段的实例,否则如果存在,则使用该snd
字段的实例。这最终会导致关于重叠实例的看似不正确的错误。
首先,我使用了所有厨房水槽,除了OverlappingInstances
.
我还使用了多Proxy
类型和类型级别或:||:
.
A
是一个非常简单的类。ThingA
有A
实例;ThingB
没有。
下一部分的目标是编写一个A
实例,(x, y)
只要有一个A x
or实例,就会为其定义一个A y
实例。如果有A x
实例,它将返回("fst " ++) . traceA . fst
. 如果没有A x
实例但有实例B x
,它将返回("snd " ++) . traceA . fst
。
第一步是创建一个函数依赖,A
通过匹配实例头来测试是否存在实例。这是高级重叠文章中的普通方法。
如果我们可以确定是否x
和y
两者都有A
实例,我们可以确定是否(x, y)
将有一个。
现在我将脱离高级重叠中的简单示例,并引入第二个函数依赖项来选择是否使用A x
orA y
实例。Bool
(我们可以使用与for不同的类型Chooses
,SwitchA
以避免与 混淆APred
。)
如果有A x
实例,我们将始终选择'True
,否则'False
。
然后,就像高级重叠示例一样,我定义了一个与A
except 相同的类,为选项添加一个额外的类型变量,Proxy
为每个成员添加一个参数。
这很容易定义实例
最后,如果有SwitchA
相同类型的实例(x, y)
Chooses
,我们可以定义一个A (x, y)
实例。
到这里为止的所有东西都编译得很漂亮。但是,如果我尝试添加
我收到以下错误。
这里发生了什么?为什么在寻找 ; 的实例时这些实例会重叠Chooses 'True ...
?实例不应该在已知instance flag ~ 'False => Chooses flag ...
时无法匹配吗?flag
'True
相反,如果我尝试
我得到错误
当我试图推动编译器去做它设计不做的事情时,任何对正在发生的事情的洞察都会有所帮助。
编辑 - 简化
根据对此答案的观察,我们可以完全摆脱Chooses
并写
这解决了问题traceA (ThingB, ThingA)
haskell - 使类型类实例自动成为另一个实例
我想要实现的是,以下类 ( SampleSpace
) 的任何实例都应该自动成为 的实例Show
,因为SampleSpace
包含创建 String 表示所需的整个接口,因此该类的所有可能实例实际上都是相同的。
因为,正如我已经发现的那样,在匹配实例声明时,GHC 只查看头部,而不是约束,因此它认为Show (s a)
也是关于 Rational:
问题:是否有可能(除了启用重叠实例)使类型类的任何实例也自动成为另一个类型的实例?
class - 第三次尝试 - 类实例覆盖另一个实例
问题是当按下加载第二个文件的按钮时,类实例 LowE 被 MedE 覆盖。
我试图在没有发布整个项目代码的情况下提出这个问题,但没有成功所以,这就是我所拥有的:
文件 runData.h
(MAXPOINTS,7); 静态数组 ^fData1 = gcnew 数组(MAXPOINTS,7);
文件 Form1.h
杂注末端区域
私人:系统::无效cbx_WellPlateList_SelectedIndexChanged(系统::对象^发件人,系统::EventArgs^ e){
if (!sr) { tbx_File1->Text = "无法打开文件。";
}
私人:系统::无效btnFile2_Click(系统::对象^发件人,系统::EventArgs^ e){
if (!sr) { tbx_File2->Text = "无法打开文件。";
}
私人:系统::无效btnFile3_Click(系统::对象^发件人,系统::EventArgs^ e){
if (!sr) { tbx_File3->Text = "无法打开文件。";
}
私人:System::Void btn_Exit_Click(System::Object^ sender, System::EventArgs^ e) {
私人:System::Void btn_Graph1_Click(System::Object^ 发件人,System::EventArgs^ e) {
私人:System::Void btn_Graph2_Click(System::Object^ sender, System::EventArgs^ e) {
私人:System::Void btn_Graph3_Click(System::Object^ sender, System::EventArgs^ e) {
私人:System::Void btn_Create_Click(System::Object^ sender, System::EventArgs^ e) {
};
// 新数据 = *数据;
// runData 填充数据;// = (新的运行数据);
希望这是足够的信息。
问题是当按下加载第二个文件的按钮时,类实例 LowE 被 MedE 覆盖。
haskell - 不存在量化方法时重叠实例错误的原因
给定以下代码,forall a r
从失败类型中删除go
“Typeable (D r) 的重叠实例”。我想知道为什么?
该错误还说“选择取决于”的实例化r
-但这不是由提供的固定Proxy r
吗?
haskell - 我可以像 Haskell 中的 7.10 一样在 7.8 中指定重叠/可重叠吗?
是否可以使用 ghc 7.8 OverlappingInstances 指定哪个实例重叠以及哪个实例可重叠?
我正在尝试在servant/servant-server 包中进行一些更新/更改。一切都编译得很好,所有测试都通过了,除了一个 doctest 在我为 Raw 添加这个更改之前通过了 Enter 实例。doctest 仅在 ghc 7.8 上失败,并在 ghc 7.10 上通过。我相信这与 ghc 7.10 我可以指定哪个实例是重叠的以及哪个实例是可重叠的这一事实有关。ghc 7.8 我怎样才能做到这一点?任何想法/指针将不胜感激。这是我在 ghc 7.8 上遇到的 doctest 和失败错误:
haskell - 我可以使用 OverlappingInstances 来获得更好的错误消息吗?
我目前正在处理一些我没有编写的 Haskell 代码,但我已经对其进行了更改。更改后,我运行程序并收到以下错误消息:
调用!!
不在我的代码中,因此如果可以避免的话,重构它比我想做的工作要多。
我想要做这样的事情:
即,该函数!!
是为每种可能的列表类型定义的,但只要为元素类型定义了 Show 实例,它的行为就会不同。
或者,一种tryShow :: a -> Maybe String
方法也可以解决问题。
有没有办法做到这一点?仅当 Show 实现不适用时,我可以强制 OverlappingInstances 使用默认实现吗?这是有保证的行为吗?
编辑:任何可以得到错误的人也可以打印类似堆栈跟踪的消息!
haskell - 需要不连贯实例但似乎总是选择“正确”实例的奇怪程序?
考虑以下程序,它仅在启用不连贯实例的情况下编译:
当编译没有不连贯的实例时,它声称多个实例匹配。这似乎意味着当允许不连贯的实例时,将任意选择实例。
除非我非常幸运,否则这将导致编译错误,因为在大多数情况下不会满足实例约束。
但是对于不连贯的实例,我没有得到任何编译错误,并且确实得到了选择“正确”实例的以下输出:
所以我只能在这里总结几件事之一:
- GHC 正在回溯实例上下文故障(它说它在自己的文档中没有这样做)
- GHC 实际上知道只有一个匹配的实例,但没有足够的勇气使用它,除非打开不连贯的实例
- 我刚刚非常幸运(三分之一3 = 27 机会)
- 其他事情正在发生。
我怀疑答案是 4(可能与 2 结合)。我想要任何答案来解释这里发生了什么,以及在不连贯的实例中我可以在多大程度上依赖这种行为?如果它是可靠的,那么我似乎可以使用这种行为来制作相当复杂的类层次结构,实际上它的行为有点像子类型化,例如我可以说所有类型的 A 类和 B 类都在 C 类中,并且实例编写者可以为A 无需显式地为 C 创建一个实例。
编辑:
我怀疑答案与GHC 文档中的这个有关:
- 找到与目标约束匹配的所有实例 I;也就是说,目标约束是 I 的替换实例。这些实例声明是候选。
- 消除以下两项都成立的任何候选人 IX:
- 还有另一个更具体的候选 IY;也就是说,IY 是 IX 的替代实例,反之则不然。
- IX 是可重叠的,或者 IY 是重叠的。(这种“要么/或”设计,而不是“两者/和”设计,允许客户端故意覆盖库中的实例,而无需更改库。)
如果只剩下一个不连贯的候选者,则选择它。如果所有剩余的候选人都语无伦次,请选择一个任意的候选人。否则搜索失败(即当不止一个幸存的候选者不是不连贯的时候)。
如果所选候选者(来自上一步)不连贯,则搜索成功,并返回该候选者。
如果不是,则查找与目标约束一致但不匹配的所有实例。当目标约束被进一步实例化时,此类非候选实例可能匹配。如果全部不连贯,则搜索成功,返回选中的候选;如果不是,则搜索失败。
如果我错了,请纠正我,但无论是否选择了不连贯的实例,在第一步中,只有一个实例“匹配”。在不连贯的情况下,我们在第 4 步与那个“匹配”的情况发生冲突。但在不连贯的情况下,我们然后转到第 4 步,即使只有一个实例“匹配”,我们发现其他实例“统一” . 所以我们必须拒绝。
这种理解正确吗?
如果是这样,有人可以准确解释“匹配”和“统一”的含义,以及它们之间的区别吗?
haskell - Free Monad 的 MonadError 实例
我用 sum 数据类型创建了一个非常有用的 Free Monad。这抽象了对持久数据存储的访问:
我想创建DataStore
一个实例,MonadError
错误消息处理为(Free (Error str))
:
但是我遇到了重叠实例错误。
DataStore
制作单子和实例的正确方法是MonadError
什么?
haskell - 将函数调用移动到 where 子句使用 OverlappingInstances 中断类型检查器
我OverlappingInstances
用来制作一个漂亮的打印类,Show
只要我没有为某种类型提供自定义实例,它就会默认使用。
where
由于某种原因,每当您使用子句或let
表达式时,这似乎都会中断。
现在,如果我删除默认的重叠实例,所有其他实例都可以正常工作。
我希望有人可以向我解释为什么会发生这种情况,还是只是一个错误?
我为每个人得到的具体错误是:
因此,出于某种原因where
/let
正在欺骗类型检查器认为View
requires Show
,而实际上不需要。