问题标签 [value-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 回答
216 浏览

f# - 为什么 MergeSort 函数会发生值限制?

我在 List 上有一个非常简单的MergeSort实现。

但每当我尝试使用 F# Interactive 中的任何输入进行测试时:

我遇到了一个值限制错误:

错误 FS0030:值限制。值 'xs' 已被推断为具有泛型类型 val xs : '_a list when '_a : compare 将 'xs' 定义为简单的数据项,使其成为具有显式参数的函数,或者,如果您不打算这样做要通用,请添加类型注释。

为什么会这样?有什么简单的修复方法?

0 投票
2 回答
307 浏览

types - 元组中的 OCaml 意外类型不匹配

我正在尝试编写一个函数,它接受一个整数和一个三元组,并在给定位置返回三元组的一个元素(Hickey 书中的练习 5.3)。Triplet 应该能够包含不同类型的元素。

我想,如果我写 3 个小函数,每个返回三元组的一个特定元素,并让我的大函数相应地返回其中一个,那么它会成功,但它不起作用。

我试图摆弄这个“eta-expansion”概念,但我没有得到它。

所以这里应该只写“2”。有什么建议吗?

0 投票
1 回答
268 浏览

f# - F# 中的值限制

我有一个 F# 任务,我正在尝试计算矩阵的转置。很简单,但我不断收到价值限制错误,我不知道为什么。我咨询了许多存在的 VR 错误问题,但我仍然一无所知。这是我的代码:

我认为该错误部分是由于列表为空,但我所做的似乎无济于事。任何指针将不胜感激。

编辑:以下版本的代码有效。谁能解释为什么

但是,编译器仍然抱怨上面的转置调用应该有一个单元类型,除非我使用 let 绑定它。谁能澄清这里发生了什么?

0 投票
3 回答
1208 浏览

functional-programming - OCaml 中的弱多态性

我对OCaml中的弱多态性有点困惑。

请参阅以下片段,我在其中定义了一个函数remember

编译器可以推断多态类型'a -> 'a,并cache在本地使用。

但是当我将上面的代码修改成

编译器推断出弱多态类型'_a -> '_a,而且,它似乎cacheremember.

为什么编译器在这里推断出弱多态类型,为什么是cache共享的?

更重要的是,如果我再次更改代码

编译器推断多态类型'a -> 'a -> 'acache在本地使用。为什么会这样?

0 投票
1 回答
137 浏览

sml - 使用前定义类型

根据 MLton 文档:

标准 ML 要求在使用之前定义类型。[链接]

并非所有实现都强制执行此要求(例如,SML/NJ 没有),但上面链接的页面很好地说明了为什么可能需要它来保证健全性(取决于实现如何处理值限制),并且它符合定义中的一些评论:

尽管在我们的定义中没有假设,但每个上下文C = T , U , E都具有tynames ET的属性。因此,可以松散地认为T包含所有“已生成”的类型名称。[…] 当然,就语义规则而言,关于“已生成”的内容的评论并不精确。但是下面的精确结果很容易证明:

令 S 是一个句子T , U , E短语A,使得词名ET,并且让 S′ 是一个句子T ′, U ′, E ′ ⊢短语′ ⇒ A ′ 出现在 S 的证明中;然后还有tynames E ′ ⊆ T ′。

[第 21 页]

但我对此感到双重困惑。

首先——上述定理似乎倒退了。如果我正确理解“在 S 的证明中发生”这个短语,那么这似乎意味着(通过反证法)“一旦你的上下文违反了 tynames ET的意图,所有后续上下文也将违反该意图”。即使这是真的,似乎断言相反会更有用和有意义,即“如果到目前为止所有上下文都符合 tynames E⊆ T 的意图那么任何随后可推断的上下文也将符合该意图”。不?

其次 - MLton 的陈述和Definition的陈述实际上似乎都没有得到推理规则(或遵循它们的“进一步限制”)的支持。一些推理规则将“tynames τT of C ”或“tynames VET of C ”作为附带条件,但该程序不需要这些规则(在上面链接的文档中给出):

(特别是:规则 (4) 与 相关let,规则 (14) 与 相关=>,规则 (26) 与 相关rec。本程序中均未使用这些。)

而从另一个方向来看,规则 (17) 涵盖了datatype声明,只要求生成的类型名称不在C的T中;因此它不会阻止生成在现有值环境中使用的类型名称(除非 tynames VET of C已经是真的)。

我觉得我可能在这里遗漏了一些非常基本的东西,但我不知道它可能是什么!

0 投票
2 回答
107 浏览

f# - 定义平方和而不定义参数

我想在sumOfSquares没有明确使用参数的情况下进行定义,而是依靠功能组合

下面是我的代码

但是,我收到以下错误

标准输入(80,5):错误 FS0030:值限制。值“sumOfSquares”已被推断为具有泛型类型

要么使“sumOfSquares”的参数显式,或者,如果您不希望它是通用的,请添加类型注释。

解决它的一种方法是使用参数

这将起作用。但是,我想看看我是否可以单独使用组合来定义平方和

更新

这是一篇很好的文章,描述了我遇到的问题:Value Restriction。

0 投票
3 回答
596 浏览

ocaml - ocaml 格式化程序和值限制

编辑对不起大家,我以为我的小考试已经完成,结果不是。 我做了一个新的,真的应该是!

一旦我将格式化程序用作 Scanf 或 Printf 函数的参数,格式化程序类型就会分别绑定到输入或输出通道。有没有办法让函数采用格式化程序(或字符串)并将其用作打印和阅读的格式化程序?

这意味着后续Printf.printf fmt 1 2;;会给出类型错误。这适用于我尝试过 的每种功能组合format_of_string和类似功能。Scanf.format_from_string

例子:

对于both函数的最后一行,这似乎是有道理的,但如果我both从模块中删除函数,我可以使用相同的格式字符串(与参数相同的变量)调用read和,它就可以工作。print

所以,希望你们还没有放弃我;我该如何解决?在这种情况下,eta-expansion 和类型注释似乎都不起作用?

0 投票
1 回答
100 浏览

polymorphism - 为什么是这种弱多态类型?

在这个小例子中,为什么M.foo 123会有一个弱多态类型(int, '_a) M.t)

0 投票
2 回答
68 浏览

ocaml - 是否可以在不涉及 ref 或部分应用的情况下编写弱多态函数?

是弱多态性,但涉及ref.

有什么方法可以在不涉及refor的情况下编写弱多态函数partial application

0 投票
2 回答
178 浏览

f# - F#:算术运算符和多态性丢失(值限制?)

此代码无法编译:

我猜统一器修复了与它们第一次出现相关联的类型f参数g。是什么支配了这个过程?我认为这与“价值限制”非常相似,但f已经g被 eta 扩展了!这是一个难题。

我肯定会想象在整数类型上键入具有临时多态性的预定义运算符背后有一些黑魔法,但这只是我的猜测。任何信息表示赞赏。