您的位置:首页 > 其它

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

2016-11-15 23:00 155 查看


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)”



转载自:http://hongjiang.info/scala/ 推荐大家阅读下这位大哥出版的书《Scala函数式编程》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐