问题标签 [type-inference]

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 投票
2 回答
1655 浏览

haskell - 为什么 Haskell 会抛出“无法构造无限类型”错误?

我在 Haskell 中编写了以下代码来计算两个向量的点积,但由于以下错误而无法编译:

cannot construct infinite type: a = [a] When generalising the type(s) for dot'

我已经提前查看了这个问题以获得指导。据我所知,类型是正确的。x、y 和两个 [] 是列表,函数返回一个数字。

怎么了?

0 投票
4 回答
764 浏览

haskell - 为什么 Haskell 将我的 Num 类型解释为 Enum?

我正在尝试在 Haskell 中编译以下函数来模拟多项式的微分,该多项式的常数在数字列表中指定:

Haskell 拒绝编译它,给我以下原因:

为什么 Haskell 将[0..]列表视为 Enum 类型,我该如何解决这个问题。请记住,我想在这里利用惰性评估,因此是无限列表。

0 投票
4 回答
2261 浏览

c++ - 自定义 C++ 预处理器/类型宏

看到了 Ruby 和 Python 中元编程的优势,但在实际工作中受限于 C++ 和C等低级语言,我正在考虑将两者结合起来的方式。一个例子是对任意结构/类的列表进行排序的简单问题。例如:

最终,我希望能够用最少的样板代码任意排序。我能看到的最简单的方法是使用 STL 的排序:

然而,这需要我编写一个可以比较“struct s”的方法。我宁愿做的是:

这显然不是有效的 C++。

实现梦想的最佳方式是什么?如果我有某种类型的宏,它将向我揭示向量元素的类型,那么编写C预处理器宏来创建执行排序所需的函数将是微不足道的。

另一种方法似乎是编写我自己的预处理器。这很好用,直到我不得不再次推断“vec”的类型。是否有捷径可寻?

背景:更少的代码=更少的错误,编程竞赛。

0 投票
2 回答
906 浏览

generics - 类型推断:使用具有隐式类型转换的泛型方法

问题是您想将 flatMap a 映射List[Option[T]]到 a List[T]

要得到:

但没有很好的解决方案:

Option[T]由于需要从to的类型转换,使用 identity 函数的明显解决方案不起作用Iterable[T]

有没有办法解决这个问题?

部分问题是,如果需要隐式类型转换,为什么类型推断器的工作方式会有所不同?

(这个问题是在讨论这个关于恒等函数的问题时出现的。)

0 投票
2 回答
1847 浏览

generics - 强制泛型和接口上的 F# 类型推断保持松散

我们在这里毛茸茸的。我已经在数据的具体表示上测试了一堆树同步代码,现在我需要对其进行抽象,以便它可以与支持正确方法的任何源和目标一起运行。[在实践中,这将是 Documentum、SQL 层次结构和文件系统等来源;具有 Solr 等目标和自定义 SQL 交叉引用存储。]

棘手的部分是,当我向下递归类型树T并同步到类型树时,在某些文件中,我需要在当前节点对该类型U执行第二种类型的“子同步” 。(代表文件的层次结构......)一旦我尝试将子同步添加到.VUVV

我在 a 中表示这个TreeComparison<'a,'b>,所以上面的内容导致 aTreeComparison<T,U>和 的子比较TreeComparison<V,U>

问题是,一旦我TreeComparison<V,'b>在其中一个类方法中提供了一个具体V的,当我希望第一个类型参数保持通用(when 'a :> ITree)时,类型就会通过所有推断传播。也许我可以在TreeComparison<V,'b>值上做一些打字?或者,更有可能的是,这个推论实际上是在告诉我,在我思考这个问题的方式上,某些东西天生就被破坏了。

压缩起来真的很棘手,但我想提供可以粘贴到脚本中并进行试验的工作代码,所以一开始有很多类型......如果你想跳过核心内容就在最后。大多数通过 ITree 进行的类型之间的实际比较和递归已被切断,因为没有必要看到我正在努力解决的推理问题。

问题可能围绕 CreateSubtree。如果您注释掉其中一个:

  1. docTree.Compare()线_
  2. tree.UpdateITree来电_

并将它们替换为(),然后推理保持通用并且一切都很可爱。

这真是一个谜。我尝试将第二个块中的“比较”函数移出类型并将它们定义为递归函数;我已经尝试了一百万种注释或强制打字的方法。我就是不明白!

我正在考虑的最后一个解决方案是对子同步的比较类型和函数进行完全独立的(和重复的)实现。但这是丑陋和可怕的。

谢谢你读到这里!嘘!

0 投票
2 回答
421 浏览

f# - 为什么不能在列表递归中推断出元组类型?

我想通过使用正则表达式来优化原始文本,给定一个 (patten,replacement) 元组列表。

我尝试在列表元素上使用模式匹配但失败了,错误显示“此表达式应具有类型字符串 * 字符串列表但此处具有类型'a 列表”。

我该如何解决这个问题?非常感谢。

代码如下:

0 投票
1 回答
863 浏览

c# - 与 COM 中的 QueryInterface 或 C++ 中的 dynamic_cast 相比,“as”的成本是多少?

我仍在尝试将我从 C/C++ 中的深厚和旧知识映射到我更浅的 .Net 知识。今天是时候在 C# 中使用“as”(隐含“is”和 cast)了。

我对“as”的心智模型是它是 C# 的一个QueryInterfacedynamic_cast(一个dynamic_cast带有指针参数,而不是引用,即)。我的问题有两个:

  1. 我的比较公平吗?
  2. QueryInterface与or相比,“as”的相对成本是dynamic_cast多少?
0 投票
1 回答
736 浏览

c# - 重载、泛型类型推断和“params”关键字

我刚刚注意到重载决议的一个奇怪行为。

假设我有以下方法:

现在,我知道通常会使用少量显式参数调用此方法,因此为方便起见,我添加了此重载:

现在我尝试调用这些方法:

params但在这两种情况下,都会调用with 的重载。我本来希望IEnumerable<T>在 a 的情况下调用重载List<T>,因为它似乎是一个更好的匹配(至少对我来说)。

这种行为正常吗?谁能解释一下?我在 MSDN 文档中找不到任何明确的信息......这里涉及的重载解决规则是什么?

0 投票
2 回答
1862 浏览

haskell - 推断类型似乎检测到无限循环,但到底发生了什么?

在 Andrew Koenig 的关于 ML 类型推断的轶事中,作者使用归并排序的实现作为 ML 的学习练习,并且很高兴发现“不正确”的类型推断。

令我惊讶的是,编译器报告了一种

换句话说,这个排序函数接受任何类型的列表并返回一个整数列表。

那是不可能的。输出必须是输入的排列;它怎么可能有不同的类型?读者肯定会发现我的第一个冲动很熟悉:我想知道我是否在编译器中发现了一个错误!

再想一想,我意识到还有另一种方法可以让函数忽略它的参数:也许它有时根本不返回。事实上,当我尝试它时,这正是发生的事情:sort(nil)确实 return nil,但是对任何非空列表进行排序都会进入无限递归循环。

翻译成 Haskell 时

GHC 推断出类似的类型:

Damas-Hindley-Milner 算法如何推断这种类型?

0 投票
3 回答
2489 浏览

functional-programming - 是什么导致了这个 Standard-ML 类型错误?

我试图制作这个非常简单的 SML 函数的尾递归版本:

在此过程中,我在参数上使用了类型注释。下面的代码显示了这一点,并导致类型错误(如下所示),而如果我只是删除类型注释,SML 会毫无问题地接受它,为整个函数提供与上面更简单的函数相同的签名。

错误:

给出了两个错误。后者在这里似乎不太重要,suffixes_helper 的两个子句不匹配。第一个是我不明白的。我注释说第一个参数是 type 'a:list,第二个参数是 type 'b:list'b:listHindley-Milner 类型推理算法不应该是建立在我理解的一般统一之上的,能够'a:list list使用 的替换来统一'b ---> 'a list吗?

编辑:答案表明它可能与不允许推断类型的类型推断算法有关,从某种意义上说,推断类型比类型注释给出的更严格。我猜想这样的规则只适用于参数和整个函数的注释。我不知道这是否正确。无论如何,我尝试将类型注释移动到函数体,我得到了同样的错误:

现在的错误是: