问题标签 [quantified-constraints]
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 一个构造 QuantifiedConstraints 的提示?
如果我有方法:
那么我如何将其作为上下文传递给:
绑定foo
到Foo
?
Dict
在这里定义https://hackage.haskell.org/package/constraints-0.10.1/docs/Data-Constraint.html#g:2
haskell - 量化约束与(封闭)类型族
我正在尝试使用这篇博文的方法来处理更高种类的数据,而不会将普通情况下Identity
的函子与量化约束推导一起使用:
这会导致令人发指的自相矛盾的错误消息:
无法
Show (HKD f a)
从上下文推断:forall a. Show a => Show (HKD f a)
有没有一种方法可以做到这一点,而不需要冗长而做
?
haskell - 为什么使用 QuantifiedConstraints 来指定类型类的子类也需要子类的实例?
我正在玩一种多类型的无标签编码Free
我可以为和没有问题编写Semigroup
实例:Free Semigroup
Free Monoid
这些实例是相同的,并且将用于Semigroup
.
我想使用QuantifiedConstraints
,所以我可以为所有子类编写一个实例Semigroup
:
但是编译器(GHC-8.6.3)抱怨它无法推断cls (Free cls u)
:
当我将它添加为实例的上下文时,它编译得很好:
添加的上下文有点冗长,但因为整个观点Free
总是cls (Free cls u)
正确的,而不是繁琐的。
我不明白的是为什么GHC 需要能够为实例编译cls (Free cls u)
的子类得出结论。我尝试用with替换定义并得到相同的错误,所以我认为问题不在于实现本身,而在于实例的声明;可能是由于我不明白的某些方面。Semigroup
Semigroup
(<>)
undefined
QuantifiedConstraints
haskell - 使用量化约束导出 Ord (forall a. Ord a => Ord (fa))
有了量化的约束,我可以Eq (A f)
很好地推导出来吗?但是,当我尝试导出 Ord (A f) 时,它失败了。当约束类具有超类时,我不明白如何使用量化约束。如何派生Ord (A f)
和其他具有超类的类?
PS。我还检查了ghc 提案 0109-quantified-constraints。使用 ghc 8.6.5
haskell - 让分布式 DSL 实现选择其序列化格式(通过约束族)
我正在编写一个分布式编程 DSL,我希望允许实现选择它们的序列化方法(如果有的话,因为它甚至可能不需要模拟执行)。
尝试通过添加类型族来解决这个问题,导致我拥有的标准函数出现以下问题。我想如果我可以要求它会起作用,并且让类型检查器理解,如果两个值是可序列化的,它们的配对也是可序列化的。但是,将其添加为量化约束似乎不起作用。可以解决这个问题还是有更好的解决方案?
编辑 1
它会检查我是否这样做
必须重复这些类型的约束会很麻烦,所以我尝试了一个类型同义词,但这不起作用:
haskell - 关联类型族的量化类型相等
我Bar
在类型类中有一个关联的类型族Foo
。Foo'
要求Bar f ~ Bar (f a)
所有a
,但在另一个函数中test
我得到一个错误Couldn't match type 'Bar f' with 'Bar (f a)'
,即使它取决于Foo' f
. 编码:
为什么 GHC 不能弄清楚这种类型的相等性,有没有办法在不断言具体相等的情况下帮助类型检查器test
?
haskell - 关联类型族和量化约束之间的交互
为什么是下面的代码:
产生错误:
但以下看似微不足道的修改foo
:
让编译器高兴?
这两个片段不应该是等价的吗?我所做的只是TheFamily t
使用等式约束将别名作为其他一些临时类型变量。
haskell - 添加约束会导致其他约束超出范围吗?
考虑以下代码,它会进行类型检查:
foo
在这里没有做任何有用的事情,但是让我们想象它正在做一些需要Eq (t a a)
实例的重要业务。编译器能够接受(Eq2 t, Eq a)
约束并详细说明Eq (t a a)
字典,因此约束被解除并且一切正常。
现在假设我们想要foo
做一些额外的工作,这些工作依赖于以下相当复杂的类的实例:
请注意,在我们的主体中,foo'
我们仍然只要求我们在 中所做的foo
:一个Eq (t a a)
约束。此外,我们没有删除或修改编译器用于详细说明 in 实例的Eq (t a a)
约束foo
;我们仍然要求(Eq2 t, Eq a)
除了新的约束。所以我也希望foo'
进行类型检查。
不幸的是,看起来实际发生的是编译器忘记了如何详细说明Eq (t a a)
. 这是我们在正文中得到的错误foo'
:
鉴于编译器可以“Eq (t a a)
从上下文”很好地“推断” (Eq2 t, Eq a)
,我不明白为什么更丰富的上下文(Eq2 t, Eq a, SomeClass t)
会导致Eq (t a a)
不可用。
这是一个错误,还是我只是做错了什么?在这两种情况下,是否有一些解决方法?
haskell - GHC 9 中量化约束的行为变化
以前,为了对像这样的类型类使用量化约束Ord
,您必须在实例中包含超类,如下所示:
(这实际上正是这个问题中给出的解决方案)。
然而,在 GHC 9 中,上述代码不起作用。它失败并出现以下错误:
不幸的是,这个AllowAmbiguousTypes
建议不起作用。(你得到相同的错误,然后是类上的每个方法的相同错误)
有谁知道这个的解决方法?
haskell - 高级类型类的量化约束
假设我想写两个 Typeclass。标题:
第一个类型类 ExClass 是这样定义的:
我将它定义为更高种类的类型类,因为它的一个函数的输出类型取决于其嵌套值的类型a
。我也希望有一个默认实现,但它涉及到MonoidexFunc
的假设。t a
现在我想为以下类型编写一个实例:
ExType a
仅当Num a
为真时才为 Monoid:
现在我继续为 定义类型类实例ExClass
,指定 的约束Num a
:
上面的代码将毫无问题地编译。但是,如果我尝试像这样使用已实现的功能:
我收到以下投诉:
当我使用不同的实例声明时也会发生这种情况:
有没有办法让这个类型类工作?还是我根本不应该像这样构建我的程序?