问题标签 [constraint-kinds]

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

haskell - GHC 7.4.1 的约束类型语法是什么?

Constraint当我尝试编写一个简单的示例时,我收到了一个不在范围内的错误,

错误是,

约束同义词似乎按预期工作,

提前致谢。

0 投票
1 回答
400 浏览

haskell - Numeric.AD 函数中的可接受类型

围绕包装中涉及的类型的基本管道,我几乎没有成功ad。例如,以下工作完美:

哪里grad有类型:

ex如果我更改to的类型签名[Double] -> Double并尝试相同的事情,我会得到

当用实例化Double的 kind 替换看似任何类型的构造函数时,也会发生相同的行为。 *Num

Traversable f是列表时, 的第一个参数grad必须具有[AD s a] -> AD s a某些可接受的类型Mode- 例如,Reverse. 但显然用户grad不必处理AD构造函数或Mode直接处理。窥视这些内部结构让我有点困惑。具体来说,我无法按照种类/类型追踪来区分 usingNum a => [a] -> a[Double] -> Double.

为什么类型签名[Double] -> Double会导致问题grad?就普通的旧库使用而言:有什么方法可以使用 的[Double] -> Double版本ex,还是需要多态版本?

(标题受这个类似问题的启发)

0 投票
1 回答
558 浏览

haskell - 是否有使用 ConstraintKinds 来概括所有基类型类以允许约束的库?

我们可以使用扩展 ConstraintKinds 来扩展基类型类的功能以允许约束。例如,我们可以将未装箱的向量设为函子:

(有关详细信息,请参阅这些博客 文章)。

我注意到自己以这种新风格实现了相当大部分的基本库类型类(基本上我希望能够在未装箱的向量和列表之间互换工作),并且想知道是否已经存在我应该使用的库,或者我是否应该充实我的并将其添加到hackage中。


编辑:另外,是否有计划将其直接添加到基地?看起来它不应该仅仅通过直接更新类定义来破坏其他任何东西。

0 投票
1 回答
220 浏览

haskell - 使用具有“有限”约束的约束种类和类型族

我正在研究一个包含一个用于“查看”执行的幺半群的应​​用函子。然而,有时我根本不关心这部分,所以幺半群的选择是无关紧要的,因为它永远不会被消耗。我已经简化了我所拥有的:

Render用于将各种as 转换为单个b. Merge是我实际仿函数的一个很大的简化,但关键是它包含一个类型族/约束,我的意图是准确指定Renderers a 的Merge要求。

现在,我可能想“运行” Merge,但丢弃视图,类似于:

但这会失败,因为:

无法推断出(Renderer a ())使用merge

我选择()作为我的幺半群a,因为我们有一个Render a (). 因此,如果有办法说这Merge a仅意味着集合Render约束,那么这将正常工作。当然,Merge a比这更笼统 - 它可以添加任意约束,这解释了编译错误。

有没有在不改变签名的情况下实现我想要的runFoo

0 投票
1 回答
764 浏览

haskell - 带有约束的类型列表

我正在尝试在类型级别构建一个列表,但是在弄清楚如何强制执行约束时遇到了一些麻烦。

我的基本代码是:

您可以认为q上面的 s 代表主要权力。我还想使用qis 的类型列表来表示合数。我在想像:

与数据

where(Head q)应该对应qi(Tail q)应该对应qs。请注意,q参数 forFList不是(必然) a (Qux q),它是的列表(Qux qi)(我不想详细说明这个列表,因为这是我提出的设计问题之一)。我想在以下方面“按模数”工作FList

在 GHC 中将这些代码片段一起编译会导致(模转录、抽象和输入错误):

接着

等等

我明白为什么会收到此错误,但不知道如何解决。

具体来说,我期待一个FList c q类型 wherec~Foo zq~QCons q1 (QCons q2 QNil),当然我的列表满足每个级别的所有 BCtx 约束。

我不确定修复这些特定错误是否会导致编译代码,但这是一个开始。整个 Bar 类基本是固定的(必须有 Constraint kind,Bar 的实例必须有 kind * -> *)。我不相信我可以使用存在类型来创建通用对象列表,因为我需要访问qi参数。我愿意更改类型FListQList允许我在 Bars 集合上按模数工作

谢谢你的时间!

0 投票
1 回答
194 浏览

haskell - 重新审视具有约束类型的多态 STUArray

我想实现一个分数类型的动态规划算法多态;这是一个没有边界条件的简化一维版本:

约束不起作用;

总结一下,Could not deduce (MArray (STUArray s) e (ST s)) from the context forall s. MArray (STUArray s) e (ST s i)。请注意,将约束添加到resultArrayST只是将问题推到runSTUArray.

我目前知道四个有缺陷的解决方案:

  1. 避免 boxed STArrays 或简单的 non-monadic Arrays 的问题,也许使用seq和 bang 模式来缓解由此产生的内存问题。
  2. unsafeFreeze用and打破类型系统,unsafePerformIO该死的约束MArray IOUArray e IO工作正常。
  3. 解决方案使用类型类并为每个“不可装箱”类型编写实例来解决类似问题。
  4. 这个使用 GHC 重写规则为每种类型(和通用STArray版本)选择不同的功能。

但是,我问这个问题是希望像现代语言扩展这样ConstraintKinds可以让我表达我的原始代码的意图forall s. MArray (STUArray s) e (ST s)

0 投票
1 回答
426 浏览

haskell - Constraint kinds: Pass multiple constraints

When I have a data type like the following in haskell:

Then I can put functions that work on values of types of a given class into this datatype:

But is it also possible to put functions which have multiple constraints into this datatype? I tried this:

So this doesn't work. How is it possible to do what I want, or is it impossible? I know one solution would be to use a "dummy" data type and a type family, but I don't want to do that if there is another way because of the it's complexity. Also, I this example I could have just used (+1) instead of succ, but there are more complex cases where such a transformation to just one class is not possible.

0 投票
1 回答
114 浏览

haskell - ConstraintKind 不一致?

我想使用自定义约束来帮助抑制组合爆炸:


当我使用自定义约束时,此代码无法编译:


但是当我手动写出我的约束时,它会编译:

这是一个错误,还是我错过了什么?

0 投票
1 回答
566 浏览

haskell - “琐碎约束”或“对象类”是否有任何标准实现?

我只想

这在 Haskell 98 中当然是没用的,因为你可以省略约束;但是ConstraintKinds我们可以明确要求 kind 参数* -> Constraint。理想情况下,我只想将其定义为“匿名类型级函数” \type a -> (),但这显然是不可能的。

我应该怎么做,使用预定义的东西,或者只是在我需要的地方定义该类(因为没有人需要访问它,因为实例是通用的,这似乎也很好)?

0 投票
1 回答
233 浏览

haskell - GHC 什么时候可以推断出约束变量?

我收到类型推断错误,因为 GHC 不会推断约束变量。它看起来可以通过一阶统一来推断。在进一步的调查中,我发现插入 let-bindings 会改变类型推断的行为。我想知道GHC在做什么。

这里的代码演示了这个问题。newtypeConstrainedF c代表类型参数受 约束的多态函数c。据我所知,GHC 不会c根据给定的值进行推断ConstrainedF

应该可以在应用程序中推断类型ConstrainedF mconcat

  1. ConstrainedF有类型forall c. (forall a. c a => [a] -> a) -> ConstrainedF c
  2. mconcat有类型forall b. Monoid b => [b] -> b
  3. forall b. Monoid b => [b] -> bforall a. c a => [a] -> a与由赋值a := b和相结合c := Monoid

然而,GHC 抱怨:

关于约束变量,我必须遵循哪些规则才能让 GHC 推断类型?


歧义类型错误的典型解决方案是添加代理值来约束歧义类型。当我尝试时,这很挑剔。如果我只是添加一个额外的参数来约束 的类型c,它可以工作:

但是引入 let 绑定会foo混淆类型推断,并且不能再cMonoid.

由于类型推断在这两个函数之一中得到了正确答案,这告诉我 GHC 在某些情况下会统一约束变量,但在其他情况下不会。我不明白发生了什么事。