【问题标题】:andThen for function of two arguments in ScalaandThen 用于 Scala 中两个参数的函数
【发布时间】:2015-02-17 16:29:21
【问题描述】:

假设我有两个函数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) =&gt; String

【问题讨论】:

标签: function scala


【解决方案1】:

它无法编译,因为andThenFunction1 的一个方法(一个参数的函数:参见scaladoc)。

您的函数f 有两个参数,因此将是Function2 的一个实例(参见scaladoc)。

为了让它编译,你需要通过元组将f转换成一个参数的函数:

scala> val h = f.tupled andThen g
h: (Int, Int) => String = <function1>

测试:

scala> val t = (1,1)
scala> h(t)
res1: String = 2

您也可以更简单地因为auto-tupling 而编写对h 的调用,而无需显式创建元组(尽管自动元组由于其潜在的混淆和失去类型安全性而引起一些争议):

scala> h(1,1)
res1: String = 2

【讨论】:

    【解决方案2】:

    Function2 没有 andThen 方法。

    不过,您可以手动编写它们:

    val h: (Int, Int) => String = { (x, y) => g(f(x,y)) }
    

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2017-12-29
      相关资源
      最近更新 更多