2017-05-02 40 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] = ??? 
} 

奖励积分使用_作为你实现第一个字符。

相关问题