2017-05-02 77 views
2

我想了解Scala中下劃線的特殊用法。以下的一段代碼我不明白在函數調用中使用下劃線與Try參數

class Test[T, S] { 
    def f1(f: T => S): Unit = f2(_ map f) 

    def f2(f: Try[T] => Try[S]): Unit = {} 
} 

_在這種情況下如何處理? T=>S如何變成Try[T]=>Try[S]

回答

2

看來你錯在讀它。看看f2(Try[T] => Try[S]):Unit的類型。

然後看着f1我們有f: T => S

_在價值位置desugars到f2(g => g map f)

讓我們來看看我們迄今知道:

  1. f2(Try[T] => Try[S]):Unit
  2. f: T => S
  3. f2(g => g map f)

給1和3,我們可以推斷出的g的類型必須是Try[T]。在Try[T]上的地圖需要T => Something,以防f這是T => S,在這種情況下,東西是S

現在看起來可能有些困難,但是一旦你學會區分類型和值的位置readin,這種類型的代碼就變得微不足道了。

另一件要注意的事情def f2(f: Try[T] => Try[S]): Unit = {}是相當無趣,可能有點不利於解決您的特定問題。

我試圖解決這個問題:首先忘記你創建的類。現在實現這個(更換???有一個有用的執行):

object P1 { 
    def fmap[A, B](A => B): Try[A] => Try[B] = ??? 
} 

獎勵積分使用_作爲你實現第一個字符。

相關問題