[原创] 【问题】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 中作为限制)。 |