2016-08-18 110 views
0

第一個stackoverflow問題和新的斯卡拉。想了解多態類型與這個例子中,我寫道:Scala類型不匹配:Nothing => Nothing?

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) 

我在想什麼t將允許「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) 
+0

將其更改爲'def testerA [A](l:List [A])(f:A => A)' –

+0

或者傳遞類型。 testerA [Char](List('a','b','c'),identFun) – sascha10000

+0

curried'def'應該像這樣調用:'testerA(List(...))(identFun)',使用''(''代替'',''' – Clashsoft

回答

1

事實證明,如果你簡化了事情,你也可以得到你想要的。

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) 
0

對於我來說,稱這是像這樣的工作:

testerA(List('a','b','c'), identFun[Char]) 

我懷疑testerA的是A型是不同的類型identFun的類型A.我不知道你將如何導致它自動解析爲字符。

+0

更新,這也適用:testerA [Char](List('a','b','c'),identFun) –

1

其他答案解釋瞭如何解決問題,但不是問題本身。問題是,如果在不指定類型參數的情況下編寫testerA(List('a','b','c'), identFun),則Scala不能使用第一個參數來推斷A,然後使用A來確定第二個參數的類型。

相反,它首先檢查兩個參數。同樣,它需要推斷List.applyidentFun的類型參數。在第一種情況下,它選擇Char(當然),但在第二種情況下它選擇Nothing。在此之後,它試圖最終決定A,但當然參數現在不兼容。

使用def testerA[A](l: List[A])(f: A => A),A推斷使用第一個參數,然後用於檢測f

+0

謝謝@AlexeyRomanov的解釋。我從Haskell的經歷中得出了同樣的結論。謝謝大家的幫助! – ericky