[英]Type mismatch in Scala(filter function)
我是Scala的新手,並嘗試着眼於功能更多的編程方面。
我正在嘗試編寫一個函數過濾器。
這是一個定義和實現:
def filter[A, B](f: A => Boolean, l: List[A]): List[B] = l match {
case Nil => List()
case x :: xs => if (f(x)) (x: B) :: filter(f, xs) else filter(f, xs)
}
使用此功能,我得到以下錯誤::32:error:type mismatch;
found : x.type (with underlying type A)
required: B
case x :: xs => if (f(x)) (x: B) :: filter(f, xs) else filter(f, xs)
現在,在此之前,我寫了一個功能圖:
def map[A, B](f: A => B, l: List[A]): List[B] = l match {
case Nil => List()
case x :: xs => f(x) :: map(f, xs)
}
實際上應用函數f將每個列表元素從類型A轉換為類型B。
我的過濾器錯誤似乎是由於過濾器采取的功能無法列出類型A的元素x導致的,因此類型檢查器認為當需要B時,我仍在構建類型A的列表。 您可以看到我試圖將x指定為B型,但是它是徒勞的。 誰能確認我正確理解了問題,以及如何使x成為B型? 我可以返回類型A的列表,但這是作為練習給出的函數定義,我無法更改它。
您的過濾器方法似乎嘗試將A
轉換為B
,這通常不是過濾器方法所能完成的。 A
和B
是兩個不相關的類型,因此您不能在它們之間進行強制轉換
您會想要這樣的東西:
def filter[A](l: List[A])(f: A => Boolean): List[A] = l match {
case Nil => List()
case x :: xs => if (f(x)) x :: filter(xs)(f) else filter(xs)(f)
}
但是您也可以寫得更簡單一些:
def filter[A](l: List[A])(f: A => Boolean): List[A] =
for (x <- l if f(x)) yield x
另請注意,我已經交換了論點並將其分開。 這樣做是為了讓scala的類型推斷自動推斷A
現在您可以執行以下操作:
filter(List(1, 3, 5, 7))(_ > 4)
隱式推斷Int
類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.