假设我有两个函数f
和g
:
val f: (Int, Int) => Int = _ + _
val g: Int => String = _ + ""
现在我想用andThen
撰写它们以获得一个函数h
val h: (Int, Int) => String = f andThen g
不幸的是它没有编译:(
scala> val h = (f andThen g)
<console> error: value andThen is not a member of (Int, Int) => Int
val h = (f andThen g)
为什么不编译?我如何撰写f
和g
来获取(Int, Int) => String
?
答案 0 :(得分:9)
它没有编译,因为andThen
是Function1
的方法(一个参数的函数:参见scaladoc)。
您的函数f
有两个参数,因此是Function2
的一个实例(请参阅scaladoc)。
要使其编译,您需要通过tupling将f
转换为一个参数的函数:
scala> val h = f.tupled andThen g
h: (Int, Int) => String = <function1>
试验:
scala> val t = (1,1)
scala> h(t)
res1: String = 2
你也可以更简单地写h
来调用scala> h(1,1)
res1: String = 2
,而不是明确地创建一个元组(尽管由于混淆和类型丢失的可能性,自动翻译有点争议 - 安全):
{{1}}
答案 1 :(得分:6)
Function2
没有andThen
方法。
您可以手动编写它们:
val h: (Int, Int) => String = { (x, y) => g(f(x,y)) }