[英]why does Scala function accepts case class type for a function argument?
[英]Scala function accepts different type
我想弄清楚為什么下面的Scala代碼編譯?
trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
def map[A, B](as: List[A])(f: A => B): List[B] = as match {
case Nil => Nil
case Cons(x, xs) => Cons(f(x), map(xs)(f))
}
def tester[A, B](as: List[A])(f1: A => List[B]) = map(as)(f1)
根據我的理解, tester
人員不應該編譯,因為map
的定義說它接受兩個參數:列表列表A => B
類型的函數A => B
但是,在tester
函數中我有函數f1
,其類型為A => List[B]
,因此,由於參數類型不匹配,我認為編譯器應該拋出錯誤。 但代碼編譯正常。
你能幫我理解代碼編寫的原因嗎?
在tester[A,B]
方法中,您實際上正在調用map[A, List[B]]
。
如果您使用不同的類型參數編寫測試器方法,則可能更容易理解代碼,然后在調用map
, A = C
和B = List[D]
。
def tester[C, D](as: List[C])(f1: C => List[D]): List[List[D]] = {
map[C, List[D]](as)(f1)
}
我認為你的誤解來自於你假設A
和B
類型對於map
和tester
都是通用的,而它們實際上是在本地定義的。 出於這個例子的目的,讓我們將tester
的B
重命名為C
這意味着map
B
實際上是List[C]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.