簡體   English   中英

Scala類型不匹配:沒什么=>沒什么?

[英]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.applyidentFun類型參數。 在第一種情況下,它選擇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.

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