types - 为什么 F# 中的函数内部不能声明类型?

标签 types f#

我正在阅读this guide to types in F# 。它说:

Types cannot be declared inside functions.

并给出一些示例代码:

let f x = 
    type A = int * int  //unexpected keyword "type"
    x * x

看起来,如果该类型仅在函数内部使用(即不返回),那么应该不会有问题。

是否有理由认为这是不可能的?

最佳答案

将类型嵌套在函数内的原因往往超出了 F# 类型系统的能力,或者表明存在代码风格问题。

问题的案例:简单抽象

让我们从问题中的情况开始,其中类型只是一些一般的抽象或简写。 F# 中似乎没有对此功能的需求 – 这并不奇怪。为了将这种类型嵌套到函数中成为一个好主意,必须满足以下要求:

  • 函数内部传递的值非常困惑,需要它们自己的类型。

  • 此类型在其他任何地方都没有用,不应公开

  • 即使作为封闭命名空间或模块中的私有(private)类型,这种类型也会导致困惑,这比将类型定义混合到函数中是一个更大的问题。

要使这个主题相关,它会变得更加奇怪:

  • 此类问题经常发生,即使采用额外的内部模块等解决方法,也无法在没有显着开销的情况下解决该问题。

呃...这听起来像是在这个问题发生之前,关注点分离就已经付诸东流了。如果存在创建这种代码是否合理的情况,我现在还不太清楚。好的代码通常是由小的、可重用的抽象构建的。上面的内容听起来并非如此。

future 案例:一流类型

这个问题有一个更有趣的方面,我希望将来能回到我们身边。也许我们想在函数内声明一个类型,因为它的定义取决于函数的输入!如果函数像对待任何其他参数一样对待类型参数并让您对它们进行操作会怎么样?

这样的功能将是泛型和类型提供程序的超集。我想这可能是一个非常优雅且非常强大的功能。但我不知道有哪种语言既允许这样做,又具有 IDE 支持的类型安全性,可以与 F# 竞争。

所以答案是:类型在 F# 中不是一等值。为此,您需要一种明显不同的语言,而这样的语言似乎还不存在。

关于types - 为什么 F# 中的函数内部不能声明类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40448757/

相关文章:

f# - 也许 monad 的 "opposite"有标准的 monad 吗?

swift - 泛型的使用

f# - 将 COM DLL 与 FSI 结合使用

Java 6 - 将 java.sql.Types 映射到 Java 类型

用于跟踪重复项的 python 数据类型

F# 转换和聚合列表列表

f# - 如何在 F# 中复制到剪贴板?

基于 F# 延续的尾递归

c++ - 什么时候数据类型对编译器的意义大于其存储空间?

c++ - 如果 void() 不返回值,我们为什么要使用它?