为什么Scala只为Function1

时间:2017-08-29 06:21:55

标签: scala functional-programming

为什么Scala只为Function1(只接受一个参数)实现了方法 andThen 。我没有看到任何其他函数没有这种方法的原因。

下面我们有合法的代码编译:

val firstFunction: String => String = ???
val secondFunction: String => String = ???
firstFunction.andThen(secondFunction)

但这不会编译:

val firstFunction: (String,String) => String = ???
val secondFunction: String => String = ???
firstFunction.andThen(secondFunction)

2 个答案:

答案 0 :(得分:5)

  

我没有看到为什么其他功能没有这样的原因   方法

因为使用Function2[String, String, String]Function1[(String, String), String]转换为Function.tupled是微不足道的:

firstFunction.tupled andThen secondFunction

这适用于任何arity的功能。

答案 1 :(得分:1)

我想您希望andThenFunction2示例中返回firstFunction.andThen(secondFunction)

您可以轻松将其添加到Function2(或任何其他FunctionN):

implicit final
class Function2MulticategoryOps[A,B,C](val f: (A,B) => C) extends AnyVal {

  def andThen[X](g: C => X): (A,B) => X =
    (a,b) => g(f(a,b))
}

tupled本身对此没什么帮助:你需要像untupled这样的东西:

// note the awful syntax for functions with domain a tuple
implicit final
class Untuple[A,B,C](val f: ((A,B)) => C) extends AnyVal {

  def untupled: (A,B) => C =
    (a,b) => f((a,b))
}

至于为什么FunctionN班级缺乏这些方法,我不知道;肯定有人会用与表现相关的东西加入。

PS 如果你问我,我认为如果有没有 FunctionN类,生活会更容易,并且几个参数的函数会只是具有域的功能产品类型;所有这些FunctionN业务只是来自带有产品的类别的可表示多类别的复杂和部分实现。