问题标签 [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 投票
3 回答
2518 浏览

scala - Scala 中的类型参数与成员类型

我想知道成员类型在 Scala 中是如何工作的,以及我应该如何关联类型。

一种方法是使关联类型成为类型参数。这种方法的优点是我可以规定类型的变化,并且我可以确定子类型不会改变类型。缺点是,我无法从函数中的类型推断类型参数。

第二种方法是使关联类型成为第二种类型的成员,它的问题是我无法对子类型的关联类型规定界限,因此,我不能在函数参数中使用该类型(当 x : X, X#T 可能与 xT 没有任何关系)

一个具体的例子是:

我有一个 DFA 的特征(可能没有 type 参数)

我想创建一个在输入序列上运行这个 DFA 的函数,我想要

  • 该函数必须将任何内容<% Seq[alphabet-type-of-the-dfa]作为输入序列类型
  • 函数调用者不需要指定类型参数,都必须推断
  • 我希望使用具体的 DFA 类型调用该函数(但如果有一个解决方案,该函数没有 DFA 的类型参数,那没关系)
  • 字母表类型必须不受约束(即,必须有一个用于 Char 以及未知用户定义类的 DFA)
  • 具有不同字母类型的 DFA 不是子类型

我试过这个:

这行得通,除了这里没有推断出类型 S,所以我必须在每个调用站点上编写整个类型参数列表。

这不起作用(对类型 D 的无效循环引用???(它是什么?))

我还删除了类型参数,创建了一个抽象类型 Sigma 并尝试在具体类中绑定该类型。runDFA 看起来像

但这不可避免地会遇到诸如“类型不匹配:预期dfa.Sigma,得到D#Sigma”之类的问题

有任何想法吗?指针?

编辑:

由于答案表明没有简单的方法可以做到这一点,有人可以详细说明为什么这是不可能的以及必须改变什么才能奏效吗?

我希望 runDFA ro 成为一个自由函数(而不是方法)的原因是我想要其他类似的函数,如自动机最小化、常规语言操作、NFA 到 DFA 转换、语言分解等,并将所有这些都放在一个类中几乎违反了OO设计的任何原则。

0 投票
3 回答
818 浏览

java - 使用泛型时使用哪些规则进行类型推断

有谁知道我在哪里可以找到关于在 Java 中使用泛型时类型推断如何工作的讨论。

0 投票
2 回答
340 浏览

java - 奇怪的 ClassCastException

这个:

没关系。

但是这个:

给出:

你知道为什么吗?!

为简单起见:

休息:

0 投票
4 回答
1404 浏览

programming-languages - 什么是类型推断?

它只存在于静态类型语言中吗?只有当语言不是强类型时才存在(即,Java 有强类型)吗?此外,它属于哪里 - 在编译阶段假设它是一种编译语言?

一般来说,当类型不明确时,规则是由语言规范规定还是由实现决定?

0 投票
3 回答
1266 浏览

haskell - 为什么这个类型变量不明确?

卷心菜.hs:

当我编译(使用 ghc)时,我收到以下错误消息:

我不明白为什么a模棱两可。第 7 行中的第 6 行肯定与第 6a行中的相同a吗?我该如何解决?

或者,是否有更好的方法来声明每个实例的常量?

0 投票
4 回答
41421 浏览

haskell - 为什么这个 Haskell 代码会产生“无限类型”错误?

我是 Haskell 的新手,面临一个我无法理解的“无法构造无限类型”错误。

事实上,除此之外,我还没有找到一个很好的解释来解释这个错误的含义,所以如果你能超越我的基本问题并解释“无限类型”错误,我真的很感激。

这是代码:

这是尝试将其加载到解释器中的错误:

谢谢。

--

这是一些更正的代码和处理 Haskell 中“无限类型”错误的一般准则:

更正的代码

问题是什么:

我的类型签名声明 intersperse 的第二个参数是列表的列表。因此,当我对“s (x:y:xs)”进行模式匹配时,x 和 y 变成了 lists。然而我将 x 和 y 视为元素,而不是列表。

处理“无限类型”错误的指南:

大多数时候,当您遇到此错误时,您已经忘记了您正在处理的各种变量的类型,并且您试图使用一个变量,就好像它是其他类型一样。仔细查看所有内容的类型与您使用它的方式,这通常会发现问题。

0 投票
4 回答
707 浏览

haskell - Haskell 如何知道您指的是哪个类型类实例?

这个问题是在阅读优秀的 Learn You a Haskell 中关于应用函子的新章节时出现的。

作为 Maybe 实例定义的一部分,Applicative 类型类具有:

如果我只是去 GHCi 并导入 Control.Applicative,然后执行以下操作:

我什么都不懂(有道理)。但是如果我在表达式的一部分中使用它:

我只得到 7。我想这也不足为奇,但我认为类型类如何工作的一些不可或缺的东西,我认为pure这里的调用没有歧义。

如果我的困惑是有道理的,谁能详细解释发生了什么?

0 投票
1 回答
975 浏览

f# - 为什么 F# 的类型推断不能处理这个?

我有一个 FileInfo 序列,但我只关心它们的字符串名称,所以我想要一个字符串序列。起初我尝试过这样的事情:

但由于某种原因,F# 的类型推断不足以允许这样做,并让我明确地给“fi”一个类型:

为什么需要这个注释?如果知道那个fis : seq<FileInfo>和那个Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>,那么它不应该推断出 lambda 表达式的类型是FileInfo -> 'b,然后从fi.Name : string进一步推断出它的类型是FileInfo -> string吗?

0 投票
2 回答
606 浏览

f# - 为什么 F# 不能推断该语句的类型?

0 投票
6 回答
15989 浏览

c# - 具有返回值类型推断的委托 (C#)

我对代表还很陌生,我一直在使用 Steven John Metsker 的“C# 中的设计模式”一书中描述的基于代表的数据访问层(一本优秀的读物!)。它像这样定义数据访问委托:

使用它的结果是如下代码之一:

但是,由于委托的返回类型是“object”,因此您需要强制转换以获取方法(本例中的“DoFooBarMagic”)真正返回的任何内容。因此,如果“DoFooBarMagic”返回 List,您需要执行以下操作:

我想要的是能够跳过强制转换并从委托方法的返回类型中推断出委托的返回类型。我的想法是也许有一种方法可以使用 Type 参数来推断返回类型。类似于其中之一:

从委托方法的返回类型推断返回的类型,但这似乎不起作用。相反,您必须这样做:

这似乎比演员阵容更好。

那么有没有办法从委托方法的返回类型推断委托的返回类型呢?

编辑添加: 如果需要,我可以更改 Foo.Bar 的签名。当前的签名基本上是这样的:

注意:该签名是当前状态的结果,它使用了这个委托定义: