【问题标题】:Are there disadvantages to return type inference? If yes, what are they?返回类型推断有缺点吗?如果是,它们是什么?
【发布时间】:2014-04-10 16:22:10
【问题描述】:

很多静态类型语言,如 C++ 和 C#,都有局部变量类型推断(我认为分别使用关键字 autovar)。

但是,我还没有看到很多 C 派生语言(除了 cmets 中提到的那些)实现编译时 返回类型 推断。在我提出问题之前,我将描述“返回类型推断”的含义。 (我绝对是指按返回类型重载。)

以一种假设的类 C# 语言考虑这段代码:

private auto SomeMethod(int x)
{
    return 3 * x;
}

返回类型是int(编译器可以验证)这一点非常明显(对人类和编译器而言)。

多路径也是如此:

private auto SomeOtherMethod(int x)
{
    if(x == 0) return 1;
    else return 3 * x;
}

这仍然完全没有歧义,因为在上述语言中已经有一种算法来解决两个表达式是否具有兼容的类型:

private auto YetAnotherMethod(int x)
{
    var r = (x == 0) ? 1 : 3 * x;
    return r;
}

由于该算法存在并且已经以某种形式实现,因此在这方面可能不是技术问题。但是,我还没有在静态类型语言的任何地方看到它,这让我开始思考它是否有什么不好的地方。


我的问题:

  • 作为一个概念,返回类型推断是否有任何缺点或我没有看到的微妙陷阱? (除了可读性——我已经明白了。)
  • 是否存在一些极端情况,它会给静态类型语言带来问题或歧义?(我所说的“介绍”指的是 局部变量 类型推断不存在的问题'还没有。)

【问题讨论】:

  • D 编程语言支持返回类型推断,效果很好。
  • Eric Lippert 很想回答这个问题..寻找他关于这个主题的现有答案。
  • 所以,我想以后会在C#中加入它

标签: language-agnostic type-inference


【解决方案1】:

是的,有缺点。您已经提到的一个:可读性。第二 - 必须计算类型,因此需要时间(在图灵完备的类型系统中,它可能是无限的)。但也有一些不同 - 类型系统的理论要复杂得多。

让我们编写一个函数,它接受一个列表并返回它的头部。它的类型是什么?或接受一个函数的函数,一个参数应用它并返回结果。在许多语言中,您不能声明它。为了支持这种东西,java引入了泛型,但它失败了。由于一致性问题,目前它是该语言最讨厌的功能之一

另一件事:返回的类型可能不仅取决于函数的主体,还取决于调用的上下文。让我们看看 haskell(我见过的最好的类型系统)http://learnyouahaskell.com/types-and-typeclasses 有一个名为 read 的函数,它接受一个字符串,解析它并返回......无论你需要什么,一个 int,一个数组。

因此,每次设计类型系统时,设计师都必须选择她想要停止的级别。动态语言决定根本不推断类型,scala 决定做一些局部推断,但不做,例如重载或递归函数,c++ 决定不推断结果

【讨论】:

  • 这很有趣。 Haskell 有局部变量类型推断吗?如果是这样,它是如何处理的?
  • 我不太了解haskell,所以您最好在别处查看。是的,它具有本地...常量。它是如何处理的?通过它的类型系统。它计算正确的类型,然后根据它选择返回所需类型的read 的实现的类型
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多