使用Try参数在函数调用中使用下划线

时间:2017-05-02 01:03:50

标签: scala scala-placeholder-syntax

我试图了解Scala中下划线的特殊用法。以下代码我无法理解

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]

1 个答案:

答案 0 :(得分:3)

看来你错误地读了它。查看f2(Try[T] => Try[S]):Unit的类型。

然后查看f1我们有f: T => S

价值位置_去了f2(g => g map f)

让我们看看目前为止我们所知道的事情:

  1. f2(Try[T] => Try[S]):Unit
  2. f: T => S
  3. f2(g => g map f)
  4. 给出1.和3.我们可以推断出g的类型必须是Try[T]。如果Try[T]T => Something,则f上的地图需T => S,在这种情况下,某事物为S

    现在看起来有点难以阅读,但是一旦你学会区分类型和值位置,这种类型的代码变得微不足道。

    需要注意的另一件事def f2(f: Try[T] => Try[S]): Unit = {}非常无趣,可能对解决您的特定问题有点不利。

    我试着像这样解决这个问题:首先忘记你创建的课程。现在实现这个(用有用的实现替换???):

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

    对于奖励积分,请使用_作为实施中的第一个字符。