[英]Scala type mis-match: Nothing => Nothing?
第一個stackoverflow問題和Scala的新問題。 在這個例子中,我試圖理解多態類型:
def identFun[A](a: A): A = a
def testerChar(l: List[Char], f: Char => Char): List[Char] = {
val li = l.map((r: Char) => f(r: Char))
li
}
哪個工作正常(如果不是很冗長):
scala> testerChar(List('a','b','c'), identFun)
res49: List[Char] = List(a, b, c)
然而:
def testerA[A](l: List[A], f: A => A): List[A] = {
val li = l.map((r: A) => f(r: A))
li
}
產量:
scala> testerA(List('a','b','c'), identFun)
<console>:14: error: type mismatch;
found : Nothing => Nothing
required: Char => Char
testerA(List('a','b','c'), identFun)
我錯過了什么讓“ testerA”返回傳遞給它的任何類型的標識?
謝謝!
嘗試過:
def testerA[A](l: List[A])( f: A => A): List[A] = {
val li = l.map((r: A) => f(r: A))
li
}
得到:
scala> testerA(List('a','b','c'), identFun)
<console>:14: error: too many arguments for method testerA: (l: List[A])(f: A => A)List[A]
testerA(List('a','b','c'), identFun)
事實證明,如果您簡化了事情,也可以得到想要的東西。
scala> def identFun[A](a: A): A = a
identFun: [A](a: A)A
scala> def testerA[A](l: List[A])(f: A => A): List[A] = l.map(f)
testerA: [A](l: List[A])(f: A => A)List[A]
scala> testerA(List('a','b','c'))(identFun)
res5: List[Char] = List(a, b, c)
其他答案說明了如何解決問題,但沒有解決問題本身。 問題是,當您編寫testerA(List('a','b','c'), identFun)
而不指定類型參數時,Scala無法使用第一個參數來推斷A
然后使用A
來確定第二個參數的類型。
而是先對兩個參數進行類型檢查。 同樣,它需要推斷List.apply
和identFun
類型參數。 在第一種情況下,它選擇Char
(當然),但是在第二種情況下,它選擇Nothing
。 在此之后,它將嘗試最終確定A
,但現在參數現在不兼容。
使用def testerA[A](l: List[A])(f: A => A)
, A
使用第一個參數推斷A
,然后將其用於對f
。
對我來說,這樣稱呼是可行的:
testerA(List('a','b','c'), identFun[Char])
我懷疑testerA的類型A與identFun的類型A是不同的類型。我不確定您如何使它自動解析為char。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.