然后是Scala中两个参数的功能

时间:2015-02-17 16:29:22

标签: function scala

假设我有两个函数fg

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)

为什么不编译?我如何撰写fg来获取(Int, Int) => String

2 个答案:

答案 0 :(得分:9)

它没有编译,因为andThenFunction1的方法(一个参数的函数:参见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)) }