2011年8月31日水曜日

Scalaの変位


不変、共変と反変について。Scalaプログラミング入門のP.218について


  • Javaのクラスの配列は共変
  • あるクラスの配列を引数として、宣言している場合、サブクラスの配列を引数として渡せる。String[] をObject[]を代入可能
  • Javaのジェネリクスは共変ではなく、不変List<string> はList<Object>に代入できない。 Javaのクラスの配列は共変となっているが、型の安全性をコンパイル時に保証してくれない。

Scalaでは不変、共変、反変について指定することが可能

  • 不変:[T]
  • 共変:[+T]
  • 反変:[-T]

不変

ScalaではArray[T]は不変です。foo(a:Array[String])メソッドに渡せるのはArray[String]のみです。
ミュータブルの場合に、型引数を不変にすることが望ましい。

  1. class Holder[T](var data: T)  
  2.     def add(in: Holder[Int]) { in.data = in.data + 1 }  
  3.     val h = new Holder(0)  
  4.     add(h)  
  5.     println(h.data)  

Holder[Number]はDoubleも保持できます。

  1. val nh = new Holder[Number](33.3d)  
  2.     def round(in: Holder[Number]) { in.data = in.data.intValue }  
  3.     println(round(nh))  
  4.     println(nh.data.getClass)  
  5.   
  6.     val dh = new Holder(33.3d)  
  7.     round(dh)   &lt;--コンパイルエラー  

共変

共変にする場合には、型引数の前に+をつける。
共変の型引数は読み取り専用のコンテナに便利
List[+T]と定義して、List[String]をList[Any]を引数としてメソッドに引数として渡すので、
Listのすべての要素はAnyである要件を満たしているため、Listは共変となります。Listの内容は変更できません。

サンプル

  1. class Getable[+T](val data: T)  
  2. def get(in: Getable[Any]) { println("It's " + in.data) }  
  3. val gs = new Getable("String")  
  4. get(gs)  
  5.   
  6. def getNum(in: Getable[Number]) = in.data.intValue  
  7. import java.lang.{ Double => JDouble }  
  8. val gd = new Getable(new JDouble(33.3))  
  9. println(getNum(gd))      
つまり、Getable[+T]で定義したときGetable[String]をGetable[Any]に代入することができる。
子クラスの型に対して親クラスの型に代入することができる。

反変

Putable[String]を引数とするメソッドに対してPutable[AnyRef]を渡して呼び出せます。
  1. class Putable[-T] {  
  2.   def put(in: T) { println("Putting " + in) }  
  3. }  
  4. def writeOnly(in: Putable[String]) { in.put("Hello") }  
  5. val p = new Putable[AnyRef]  
  6. writeOnly(p)  
  7. //  
  8. trait DS[-In, +Out] { def apply(i: In): Out }  
  9. val t1 = new DS[Any, Int] { def apply(i: Any) = i.toString.toInt }  
  10. def check(in: DS[String, Any]) = in("333")  
  11. println(check(t1))  


Putable[-T]で定義したときにPutable[AnyRef]をPutable[String]に代入
反変は共変の反対で親クラスの型に対して、子クラスの型に代入することができる。

変位ルール

  • ミュータブルなコンテナは不変
  • イミュータブルなコンテナは共変[+T]
  • 変換処理の入力は反変[-T]に、出力は共変[+T]

ScalaのFunctionNトレイトは反変の引数と共変の戻り値を持っている。


2011年8月15日月曜日

X++って初めて知った。

世の中には色んな言語があるなぁと、思います。
InfoQの記事を見てX++を初めて知りました。infoQの記事

設計の方針としては、Javaのデータアクセス機能を強化したスーパーセットとのことです。
現在の開発はMicrosoft Dynamics AXとなったようです。
そのため、microsoftのページでの説明はすべてC#との比較となっています。
MicroSoftのページ

InfoQでは、SQLについての説明がメインですが、Microsoftのページを見ると逆にSQLについてはあまり記述していなく、以下の点がサポートされていますと記載されていた。
  • ファイル入出力
  • フォームやレポートなどのUI項目の操作
  • 動的配列のサポート
  • オブジェクトのコレクション
  • XMLビルディング、パース

記事を見る限りわかったことはこんな感じ

  • サポート機能
    • retry
    • case文に式、複数の値の記述
    • イテレータの途中の追加削除
  • 未サポート
    • finnaly
    • オーバーロード


今回はへぇ、こんなのがあるんだレベルでしか調べなかったので、機会があればもうちょっと調べてみようかなぁとは

2011年8月12日金曜日

VisualStudioでScala

Scala comes to .NET
にも記述されていますが、Visual Studioでscala開発が可能になるとこのこと。
まぁ、C#,F#とかJVMになっているし、あり得る方向なのかなぁ。。。。
microsoft にもscalaの有用性があると認識されたということだな。

リンク先の翻訳は時間があれば