Types 为什么可以';t类型可以在F#中的函数内声明?

Types 为什么可以';t类型可以在F#中的函数内声明?,types,f#,Types,F#,我在看书。它说: 不能在函数内声明类型 并给出了一些示例代码: let f x = type A = int * int //unexpected keyword "type" x * x 似乎如果类型仅在函数内部使用(即未返回),那么就不会出现问题 这是不可能的原因吗 在函数中嵌套类型的原因往往不在F#type系统的能力范围内,或者是代码风格问题的一个指标 问题的情况:简单抽象 让我们从问题中的情况开始,类型只是一些一般的抽象或速记。在F#中似乎没有对这一功能的需求——这

我在看书。它说:

不能在函数内声明类型

并给出了一些示例代码:

let f x = 
    type A = int * int  //unexpected keyword "type"
    x * x
似乎如果类型仅在函数内部使用(即未返回),那么就不会出现问题


这是不可能的原因吗

在函数中嵌套类型的原因往往不在F#type系统的能力范围内,或者是代码风格问题的一个指标

问题的情况:简单抽象 让我们从问题中的情况开始,类型只是一些一般的抽象或速记。在F#中似乎没有对这一功能的需求——这并不令人惊讶。要将此类类型嵌套到函数中是一个好主意,必须满足以下要求:

  • 函数中传递的值非常混乱,需要它们自己的类型

  • 这种类型在其他任何地方都没有用处,不应该公开

  • 与将类型定义混合到函数中相比,即使作为封闭命名空间或模块中的私有类型,这种类型也会导致混乱

对于这个主题来说,它变得更加奇怪:

  • 这种类型的问题经常发生,甚至像内部额外模块这样的变通方法也无法在没有显著开销的情况下解决它
啊。。。这听起来像是在这个问题发生之前,关注点的分离就消失了。如果有一种情况下创建这种代码是合理的,我现在还不能完全弄清楚。好的代码通常是从小的、可重用的抽象中构建的。上面的话听起来根本不像那样

未来主义案例:第一类类型 这个问题有一个更有趣的方面,我希望将来会回到我们这里。也许我们想在函数中声明一个类型,因为它的定义取决于函数的输入!如果函数像对待任何其他参数一样对待类型参数并允许您对其进行操作,该怎么办

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


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

我想更重要的是,你为什么要这样做?附议@JohnPalmer所说的。我很难想出一个实际的场景(注意限定符),在那里这将是有用的。这在实践中对你来说是个问题吗?当然有原因。实现特性是有成本的。这项功能几乎一文不值。你为什么要浪费时间来实现这个特性,而不是在有价值的事情上使用它呢?您是否有这样一个场景:定义函数作用域类型会很有用?@Luaan-我有这样一个场景。可以在函数中创建其他函数,这些函数可能具有复杂类型的参数,如list->list。有时,F#迫使人们对类型进行显式处理,或者人们可能希望使类型显式化以提高代码可读性。在这种情况下,为类型指定别名会很有用。@sdgfsdh有一个类似于F#的别名,并且具有依赖类型。虽然我认为这在很大程度上是一个与一流类型正交的特性。依赖类型涉及在类型中表达附加约束的能力。第一类类型将涉及以更灵活的方式创建类型的能力,与诸如C++模板、代码生成器、类型提供程序等特征进行竞争。