[原创] 【问题】Scala中type语句的罕见语法--中缀类型的用法

fineqtbull 2009-10-17
有如下语句,比较罕见,特别是第二句中of的用法,有谁能解释一下吗?谢谢!
scala> type of[m[_],t] = m[t]
defined type alias of

scala>  var x: List of Int = List(1,2,3)
x: of[List,Int] = List(1, 2, 3)
eyeliang 2009-10-17
此语句从未用过
eyeliang 2009-10-17
下面好像是读什么数组
fineqtbull 2009-10-17
eyeliang 写道
下面好像是读什么数组

List of Int从效果上来说的确等价于List[Int],即List范型,但是这种语法形式从来没有看到过,所以有点新奇。
fineqtbull 2009-10-17
明白了,这是中缀类型的用法。
type of[m[_],t] = m[t]

of有两个类型参数,所以称为中缀类型,这里的of将等式右边的m[t]拆分成为m(注:m[_]中_为占位符,用来代表任意类型参数)和t两个参数。中缀类型有点类似于中缀操作,即只有一个操作数的方法。假如有obj.op(1),obj为对象,op为中缀操作,1为操作数,那么方法调用也可以写为obj op 1。在中缀类型中也有同样的情况,比如以下语句
var x: List of Int = List(1,2,3)

由于of是中缀类型,所以of[List, Int]同样可以写为List of Int。而of[List,Int]又等同于List[Int],也就是List(1, 2, 3)的类型相匹配了。
cosina 2009-10-18
fineqtbull 写道
明白了,这是中缀类型的用法。
type of[m[_],t] = m[t]

of有两个类型参数,所以称为中缀类型,这里的of将等式右边的m[t]拆分成为m(注:m[_]中_为占位符,用来代表任意类型参数)和t两个参数。中缀类型有点类似于中缀操作,即只有一个操作数的方法。假如有obj.op(1),obj为对象,op为中缀操作,1为操作数,那么方法调用也可以写为obj op 1。在中缀类型中也有同样的情况,比如以下语句
var x: List of Int = List(1,2,3)

由于of是中缀类型,所以of[List, Int]同样可以写为List of Int。而of[List,Int]又等同于List[Int],也就是List(1, 2, 3)的类型相匹配了。



implicit conversions
fineqtbull 2009-10-18
cosina 写道
implicit conversions


不太明白,可否详细一点
night_stalker 2009-10-19
和 implicit conversion 没关系。

scala 有两个世界(范畴): 值的世界和类型的世界。类型也可以做演算和比较。

下面两个 a,是同一个东西态射到这两个世界的结果:

type F = Int=>Int
def  a(f:F, x:Int) = f(x)
type a[f[_], x]    = f[x]


把 type 理解为对类型的 def 就行了。

ps:如果像 ruby 那样,每个 class 都是 object,会容易理解得多……
fineqtbull 2009-10-19
night_stalker 写道
类型也可以做演算和比较

很有趣的想法,我想该创意设计目的因该是让类型表达形式更加丰富吧,就像此例中可以将List[Int]描述为List of Int。

night_stalker 写道
把 type 理解为对类型的 def 就行了。

恩,这下type of[m[_],t] = m[t]就比较好理解了,可以认为of[m[_],t]为函数定义,m[t]为函数体。对于List of Int就可以认为,of为类型计算的函数名,List和Int为两个参数,通过函数体m[t]的计算得到了结果类型List[Int]
night_stalker 2009-10-19
不过现在能做的演算不多,可用的操作符貌似只有加号
type to[a,b] = a => b
type +[a,b] = List[(a,b)]


Int + String ----> List[(Int,String)]
Char to Double ----> (Char) => Double

type 语句还可用 >: 和 <: (抽象类和 trait 中作为限制)。
Global site tag (gtag.js) - Google Analytics