为什么Scala不允许在函数类型定义中使用参数名称?

时间:2013-12-05 15:12:17

标签: scala

斯卡拉不允许说:

def m(f:(numer:Double,denom:Double)=>tan:Double) = {...}

就像使用类型注释变量意味着变量至少具有一些文档一样,因此允许函数类型定义中的变量提供一些文档。由于它是可选的,程序员将决定何时这样做。但上述内容肯定比以下内容更具信息性:

def m(f:(Double,Double)=>Double) = {...}

这会增加灵活性会破坏语言语法吗?

2 个答案:

答案 0 :(得分:6)

可以在使用类型别名中找到解决方法。

type Numer = Double
type Denom = Double
type Tan   = Double
def m(f:(Numer,Denom)=>Tan) = {...}

以自己的方式使用语法会带来问题和歧义 - 例如编译器会检查目标函数是否具有相同的变量名称? (想想那些会绊倒你提议的那个功能的用户)

答案 1 :(得分:0)

类似于om-nom-nom的中间道路解决方法可能是有一个Fraction类,它由分子和分母以及f的更具描述性的名称组成。类似的东西:

case class Fraction(numerator: Double, denominator: Double) { ... }

...

def doSomething(getTangent: (Fraction) => Double) = { ... }

这里的弱点是没有什么可以阻止某人传递类型(分数)=>的函数。 Double实际上返回一个正弦,余弦等。所以你可以考虑使用名称trigFunc或类似的东西而不是getTangent。

至于您的原始建议,如前所述,我认为您不希望强制执行函数实现使用与类型描述中相同的参数名称,因此类型描述中的参数名称实际上只是注释,而不是编译器强制执行的任何操作。因此,scaladoc评论可能会起到同样的作用。