[英]In F#, can two functions with different arity and return types share a name?
[英]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.