为什么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)
答案 0 :(得分:5)
我没有看到为什么其他功能没有这样的原因 方法
因为使用Function2[String, String, String]
将Function1[(String, String), String]
转换为Function.tupled
是微不足道的:
firstFunction.tupled andThen secondFunction
这适用于任何arity的功能。
答案 1 :(得分:1)
我想您希望andThen
在Function2
示例中返回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
业务只是来自带有产品的类别的可表示多类别的复杂和部分实现。