2017-08-24 56 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) 

如果apply方法只需要一個參數並將其添加到mList1,它將工作。爲什麼?

感謝

+0

看看你的應用功能。它不像你認爲的那樣工作。 – puhlen

+0

儘量避免'var'和這樣的可變性,那不符合斯卡拉哲學 – cchantep

+0

@cchantep,你是對的,會修改。 – user1615666

回答

0

如果您已將返回類型添加到apply()定義中,編譯器會明確指出錯誤的位置。

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

謝謝,你是對的。但是爲什麼它在沒有返回類型的情況下工作如果apply方法採用單個參數 – user1615666

+0

所有方法都有返回類型,而不管參數如何。這個問題對參數不重要。如果你指定了期望的返回類型,編譯器會告訴你代碼是否不生成它。如果你沒有指定期望的返回類型,那麼編譯器會認爲無論代碼產生哪種方法都是正確的。 – jwvh

0

在apply方法,它更新mList1在對象和返回單元。所以變量mCustomArr將是單元類型。

如果要使用過濾方法,則需要使用MyArr對象,如MyArr.filter(x => isEven(x)).foreach(println)

但是,當我看着你的過濾器方法的實現,它看起來像mList裏面的方法從未改變。我認爲這個過濾方法可以實現像

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