2017-08-24 10 views
-2

私はScala適用と高次関数を学んでいます。私はこのコーディングを持っていますが、なぜコンパイラが私にエラーを与えたのですか?「欠落しているパラメータタイプ」、それを修正する方法は?スカラ高次関数コンパイラエラー

import scala.collection.mutable.ListBuffer 

object MyArr { 
    var mList1 = ListBuffer[Int]() 

    def filter(p: Int => Boolean): List[Int] = { 
    val mList = List[Int]() 
    for (x <- mList1) { 
     if (p(x)) x :: mList 
    } 
    mList 
    } 

    def apply(x: Array[Int]) = { 
    for (y <- x) mList1 += y 
    } 
} 

def isEven(x: Int): Boolean = { 
    x % 2 == 0 
} 

var mCustomArr = MyArr(Array(1, 2, 3, 4)) 
mCustomArr.filter(x => isEven(x)).foreach(println) 

適用方法がただ1つのパラメータを取り、それをmList1に追加すると動作します。どうして ?

ありがとう

+0

適用機能をご覧ください。それはあなたが思うように動作しません。 – puhlen

+0

Scalaの哲学 – cchantep

+0

@cchantepに対応していない 'var'やそのような変更を避けるようにしてください。 – user1615666

答えて

0

戻り値の型をapply()定義に追加した場合、コンパイラはエラーの発生箇所を正確に指摘していました。

def apply(x: Array[Int]): ListBuffer[Int] = { 
    for (y <- x) mList1 += y 
    mList1 
} 
+0

ありがとう、あなたは正しいです。 applyメソッドが単一のパラメータを取る場合には、戻り型なしで動作する理由 – user1615666

+0

すべてのメソッドには、パラメータに関係なく戻り値の型があります。パラメータはこの問題にとって重要ではありません。期待される戻り値の型を指定すると、コンパイラはコードがそれを生成しないかどうかを指示します。期待される戻り値の型を指定しない場合、コンパイラはコードが生成するものはすべてそのメソッドに対して正しいものと見なします。 – jwvh

0

applyメソッドでは、ObjectのmList1を更新してUnitを返します。したがって、変数mCustomArrはUnit型になります。

フィルタメソッドを使用する場合は、MyArr.filter(x => isEven(x)).foreach(println)のようなMyArrオブジェクトを使用する必要があります。

フィルタメソッドの実装を調べると、mList内部メソッドが変更されていないように見えます。私はあなたがScalaの、乾杯を学ぶために幸せを願ってフィルタ方式が

object MyArr { 
    var mList1 = ListBuffer[Int]() 

    def filter(p: Int => Boolean): ListBuffer[Int] = { 
    val mList = ListBuffer[Int]() 
    for (x <- mList1) { 
     if (p(x)) mList += x 
    } 
    mList 
    } 

    def apply(x: Array[Int]) = { 
    for (y <- x) mList1 += y 
    } 
} 

ように実装することができると思い。

+0

ありがとう、最後に私の更新をご覧ください。だから私はmCustomArrの問題だとは思わない。 – user1615666