我正在阅读this guide to types in F#。它说:
无法在函数内声明类型。
并提供一些示例代码:
let f x =
type A = int * int //unexpected keyword "type"
x * x
似乎如果该类型仅使用 in 函数(即未返回),那么应该没有问题。
有没有理由不这样做?
答案 0 :(得分:3)
将函数嵌套在函数内的原因往往超出F#类型系统的功能或代码样式问题的指示符。
让我们从问题中的案例开始,其中类型只是一些通用的抽象或简写。在F#中似乎没有对此功能的需求 - 这并不令人惊讶。要将这样的类型嵌套到函数中是个好主意,必须满足以下要求:
在函数内部传递的值很混乱,需要自己的类型。
这种类型在其他任何地方都没用,不应暴露
这种类型的混乱,即使作为封闭命名空间或模块中的私有类型,也会比将类型定义混合到函数中更大的问题。
要使此主题相关,它甚至更奇怪:
呃......这听起来像问题的分离在这个问题发生之前消失了。如果在某种情况下创建这种代码是合理的,我现在无法理解它。好的代码通常是从小的,可重用的抽象构建的。以上听起来就像是那样。
这个问题有一个更有趣的方面,我希望将来能回到我们身边。也许我们想在函数内声明一个类型,因为它的定义取决于函数的输入!如果函数将像任何其他参数一样处理类型参数并让您对它们进行操作会怎么样?
这样的功能将是泛型和类型提供者的超集。我想它可能是一个非常优雅和非常强大的功能。但我不知道任何语言都允许这样做,并且具有IDE支持的类型安全性,可以与F#竞争。
所以答案是:类型不是F#中的第一类值。你需要一种明显不同的语言,这种语言似乎还不存在。