繁体   English   中英

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

[英]Why can't types be declared inside functions in F#?

我正在阅读有关F#类型的指南 它说:

类型不能在函数内部声明。

并给出一些示例代码:

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

似乎如果类型仅函数内部使用(即未返回),则应该没有问题。

是否有理由无法做到这一点?

将类型嵌套在函数内部的原因往往不在F#类型系统的能力范围内,也不表示代码样式问题。

问题案例:简单抽象

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

  • 在函数内部传递的值很容易混淆,需要它们自己的类型。

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

  • 即使将其作为封闭名称空间或模块中的私有类型,这种类型也会造成比将类型定义混入函数中更大的麻烦。

为了使这个话题有意义 ,它变得更加奇怪:

  • 这种类型的问题经常发生,以至于在没有明显开销的情况下,即使是诸如内部组件额外模块之类的解决方法也无法解决该问题。

gh ...这听起来像是关注点分离在此问题发生之前就已经付诸东流。 如果在某些情况下创建这种代码是合理的,那么我现在还无法弄清楚。 好的代码通常由小的,可重用的抽象构建而成。 上面听起来不像其他任何东西。

未来派案例:一流的类型

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

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

因此,答案是:类型不是F#中的一等值。 为此,您需要一种特别不同的语言,并且这种语言似乎还不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM