在带有 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)
。
让我们看看到目前为止我们知道了什么:
f2(Try[T] => Try[S]):Unit
f: T => S
f2(g => g map f)
给出1.和3.我们可以推断g
的类型必须是Try[T]
。 Try[T]
上的映射需要 T => Something
,如果 f
是 T => S
,在这种情况下 Something 是 S
。
现在看起来可能有点难读,但是一旦你学会区分类型和值位置,阅读这种类型的代码就变得微不足道了。
另一件需要注意的事情 def f2(f: Try[T] => Try[S]): Unit = {}
非常无趣,可能不利于解决您的特定问题。
我会尝试这样解决这个问题:首先忘记您创建的 class。现在实现它(用有用的实现替换 ???
):
object P1 {
def fmap[A, B](A => B): Try[A] => Try[B] = ???
}
对于奖励积分,请使用 _
作为您实施中的第一个字符。
我想了解下划线在 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)
。
让我们看看到目前为止我们知道了什么:
f2(Try[T] => Try[S]):Unit
f: T => S
f2(g => g map f)
给出1.和3.我们可以推断g
的类型必须是Try[T]
。 Try[T]
上的映射需要 T => Something
,如果 f
是 T => S
,在这种情况下 Something 是 S
。
现在看起来可能有点难读,但是一旦你学会区分类型和值位置,阅读这种类型的代码就变得微不足道了。
另一件需要注意的事情 def f2(f: Try[T] => Try[S]): Unit = {}
非常无趣,可能不利于解决您的特定问题。
我会尝试这样解决这个问题:首先忘记您创建的 class。现在实现它(用有用的实现替换 ???
):
object P1 {
def fmap[A, B](A => B): Try[A] => Try[B] = ???
}
对于奖励积分,请使用 _
作为您实施中的第一个字符。