我正在Scala中實現List類型,當遵循一本書時。Scala將通用函數傳遞到另一個泛型函數混淆
這裏是我的列表類型的定義:
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
所有後述的功能在同伴對象列表定義在同一個文件
object List
我寫foldLeft
和foldRight
爲以下
def foldLeft[A,B](l: List[A], z: B)(f: (B, A) => B): B = l match {
case Nil => z
case Cons(x, xs) => foldLeft(xs, f(z, x))(f)
}
def foldRight[A,B](l: List[A], z: B)(f: (A, B) => B): B = l match {
case Nil => z
case Cons(x, xs) => f(x, foldRight(xs, z)(f))
}
有一個exerci這本書是用foldRight
實施foldLeft
。這是我的初步實施
def foldLeftWithRight[A,B](l: List[A], z: B)(f: (B, A) => B): B = {
foldRight(l, z)((a: A, b: B) => f(b, a))
}
然後我覺得我應該寫另一個函數做相反的論點,如果我使用foldLeft
實現foldRight
。如下:
def reverseArgs[A,B](f: (A, B) => B): (B, A) => B = {
(b: B, a: A) => f(a, b)
}
因此,我改變的foldLeftWithRight
代碼爲以下:
def foldLeftWithRight[A,B](l: List[A], z: B)(f: (B, A) => B): B = {
foldRight(l, z)(reverseArgs(f))
}
和IntelliJ抱怨reverseArgs(f)
:
類型不匹配:預期(A,B)= > B,actual(B,B)=> B
當我嘗試編譯代碼,錯誤是:
Error:(21, 37) type mismatch;
found : (B, A) => B
required: (B, Any) => Any
foldRight(l, z)(reverseArgs(f))
一個有趣的現象是,當我使用foldRightWithLeft
的reverseArgs
,有沒有問題:
def foldRightWithLeft[A,B](l: List[A], z: B)(f: (A, B) => B): B = {
foldLeft(l, z)(reverseArgs(f))
}
這到底是怎麼回事?
現在,這是有道理的,謝謝! – KenKenKen