有人可以解释下面的scala代码吗?

时间:2016-07-08 09:51:42

标签: scala

scala> def lift3[A,B,C,D] (
     | f: Function3[A,B,C,D]): Function3[Option[A], Option[B], Option[C], Option
[D]] = {
     | (oa: Option[A], ob:Option[B], oc: Option[C]) =>
     | for(a <- oa; b <- ob; c <- oc) yield f(a,b,c)
     | }
lift3: [A, B, C, D](f: (A, B, C) => D)(Option[A], Option[B], Option[C]) => Option[D]

特别是,以下一行:

def lift3[A,B,C,D] (
          f: Function3[A,B,C,D]): Function3[Option[A], Option[B], Option[C], Option
    [D]]

这取自Joshua D Suereth撰写的Scala In Depth一书(清单2.1,第2章)。我不确定附加Option[D]的用途是什么。在函数体中,代码仅映射到输出类型D的前三个参数。那么,在输入参数列表中声明D?我错过了什么吗?

由于我的理解有限,我会将函数声明读作一个函数,该函数将函数作为参数(反过来需要4个参数)并返回一个带有4个参数的函数。另外,为什么没有提到返回类型? 提前谢谢!

2 个答案:

答案 0 :(得分:3)

  

由于我的理解有限,我会将函数声明读作一个函数,该函数将函数作为参数(反过来需要4个参数)并返回一个带有4个参数的函数。另外,为什么没有提到返回类型?

Function3[A,B,C,D]是一个包含 3 参数的函数(类型ABC)和D是返回类型(它也可以写成(A, B, C) => D;这是完全相同的类型)。因此,在Function3[Option[A], Option[B], Option[C], Option[D]]中,Option[D]是返回类型,而不是参数类型。

答案 1 :(得分:2)

function3需要3个参数。 D是函数的返回类型。代码的作用是使用带有3个参数的函数并返回一个带有3个参数的函数,其中每个参数及其返回类型为&#34;提升&#34;到Option

您可以查看Function3 here.的API文档 可以在Function2

的文档中找到R泛型类型的说明