2013-04-03 35 views
12

なぜこのコードはエラーでコンパイルに失敗しますか:見つからない:値マトリックス?ドキュメントといくつかの(時代遅れの)コード例から、これはうまくいくはずですか?初心者:Scala 2.10のScala型エイリアス?

object TestMatrix extends App{ 
type Row = List[Int] 
type Matrix = List[Row] 


val m = Matrix(Row(1,2,3), 
       Row(1,2,3), 
       Row(1,2,3) 
      ) 


} 

答えて

46

Matrixはタイプを示しますが、値として使用しています。

あなたがList(1, 2, 3)を行うと、あなたが実際にListのファクトリメソッドである、List.applyを呼んでいます。

あなたは Matrixと用に独自の工場を定義することができ、あなたのコンパイルエラーを修正するには:あなたが持っている

object TestMatrix extends App{ 
    type Row = List[Int] 
    def Row(xs: Int*) = List(xs: _*) 

    type Matrix = List[Row] 
    def Matrix(xs: Row*) = List(xs: _*) 

    val m = Matrix(Row(1,2,3), 
     Row(1,2,3), 
     Row(1,2,3) 
    ) 
} 
+0

華麗です、ありがとう。それはまた、適用されるものもクリアされます。 – Tony

+2

ファクトリ関数( 'def Matrix(xs:Row *):Matrix = List(xs:_ *)')の戻り値の型を明示的に指定すると、コンパイラ/型チェッカーは結果を 'List [Row]'の代わりに 'Matrix'として見ます。 'Matrix'ファクトリメソッドと同じ' apply'メソッドを持つオブジェクトとして 'Matrix'を定義することももちろん可能です。 – ches

5

記事thisから。

Note also that along with most of the type aliases in package scala comes a value alias of the same name. For instance, there's a type alias for the List class and a value alias for the List object.

問題を解決するには、に変換:

object TestMatrix extends App{ 
    type Row = List[Int] 
    val Row = List 
    type Matrix = List[Row] 
    val Matrix = List 

    val m = Matrix(Row(1,2,3), 
        Row(1,2,3), 
        Row(1,2,3)) 
} 
+12

これは問題の一般的な解決策ですが、タイプエイリアスが型パラメータを(IntとRowに)修正するため、ここでは適切ではありません。例えば、あなたのコードでは '' Matrix( "aze"、123) '(' 'Mat [']と同じ型ではない '' List [Any] ''を返すことができます。動作。 –