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

Use of underscore in function call with Try parameters

我想了解下划线在 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] 的?

看来你看错了。查看 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)

给出1.和3.我们可以推断g的类型必须是Try[T]Try[T] 上的映射需要 T => Something,如果 fT => S,在这种情况下 Something 是 S

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

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

我会尝试这样解决这个问题:首先忘记您创建的 class。现在实现它(用有用的实现替换 ???):

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

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