簡體   English   中英

Scala中的類型不匹配(過濾器功能)

[英]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 ,這通常不是過濾器方法所能完成的。 AB是兩個不相關的類型,因此您不能在它們之間進行強制轉換

您會想要這樣的東西:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM