scala类型系统:16) 函数类型

函数类型在写法上

(T1,T2…) => R

小括号里的是入参类型(最多可以有22个,最少为0),右箭头右边的是返回结果类型。

函数类型里可以使用通配符“_”,表示任意类型:

scala> val x: String => _ = null
x: Function1[String, _] = null

右箭头形式的背后是转换成FunctionN[T1,T2…, R] (N对应0~22),有点要注意的是,FunctionN在对其类型参数的定义,入参类型都是逆变的,而结果类型是协变的。它反映了函数类型也是具有多态特性的,参考这篇:scala中函数类型的多态,这里再补充一下温悦在ATA上对这篇blog的评论,他的这张图很好:

有2个函数: f1, f2; 我们若能说f2是f1的子类,当且仅当:f2的定义域类型x2 “大于” f1的定义域类型x1,且f2的值域y2 “小于” f1的值域y1; 其中“大于”指“是父类”;“小于”指“是子类”;

进一步讲,f1(父类函数)能接受的任意参数,f2也能接受,且经由f2映射而得出的结果的类型,也一定在经由f1映射所得结果的类型的“范围内”(是其子类)

再进一步讲:当代码里有对f1的调用“f1(x)”时,你可以尽管将这里的f1换成f2而不会出现类型错误,这也就是关乎“函数类型”的“里氏替换原则(LSP)”

2 thoughts on “scala类型系统:16) 函数类型

  1. x1(“SomeString”) 为什么会提示”Unspecified value parameter v1.

    scala> x(“SomeString”)
    java.lang.NullPointerException
    … 32 elided

    请问该如何调用 x 呢?

Leave a Reply

Your email address will not be published. Required fields are marked *