问题标签 [monomorphism-restriction]

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 回答
155 浏览

haskell - Rigid / skolem 类型变量:作为参数很好,但使用本地 where/let 语句转义范围

什么是 skolems?,这有效:

但是为什么不这样:

(或类似的版本let)。它产生的错误包括:

是否可以通过添加一些类型声明来使其工作(有点像该问题s :: forall a. I a -> String中示例的解决方案withContext)。我觉得我想在Eq x某个地方添加一个。

我(可能是幼稚的)对reflexive工作原理的理解如下:

  • 它需要一个 type 的值AnyEq。这在其中嵌入了任何类型的值,只要它是Eq. 这种内部类型在的类型签名中并不明显,并且在编译reflexive时是未知的。reflexive
  • 该绑定生成(AE x) = aex一个未知类型的值,但已知它是Eq. (所以就像变量 x 和 y 一样myEq :: Eq a => a -> a -> Bool; myEq x y = x == y
  • ==基于隐含的类约束,操作员很高兴。

我想不出为什么reflexive2不做同样的事情,除了像“单态限制”或“单局部绑定”这样的事情,有时会让事情变得很奇怪。我尝试使用 and 的所有组合进行编译NoMonomorphismRestrictionNoMonoLocalBinds但无济于事。

谢谢。