簡體   English   中英

Scala函數接受不同的類型

[英]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]]

如果您使用不同的類型參數編寫測試器方法,則可能更容易理解代碼,然后在調用mapA = CB = List[D]

def tester[C, D](as: List[C])(f1: C => List[D]): List[List[D]] = {
  map[C, List[D]](as)(f1)
}

我認為你的誤解來自於你假設AB類型對於maptester都是通用的,而它們實際上是在本地定義的。 出於這個例子的目的,讓我們將testerB重命名為C 這意味着map B實際上是List[C]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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