【问题标题】:How two abstract the number of parameters of a function with type parameters in Scala?Scala中两个如何抽象出具有类型参数的函数的参数数量?
【发布时间】:2013-09-11 11:32:36
【问题描述】:

任意函数都有一个 Wrapper 类。我尝试用两个类型参数[I,O](用于输入和输出)来抽象函数的输入和输出(返回值)。

class Wrapper[I, O](protected val f: I => O {

    protected def doIt(input: I): O = f(input)

}

由于这应该是任意函数的包装器,所以我对带有多个参数的函数有疑问。

val multiplyFunction = (a: Int, b: Int) => a * b
val multiplyWrapper = new Wrapper[(Int, Int), Int](multiplyFunction)

第二行无法编译,因为包装器需要一个函数,该函数接受一个带有两个 Int 的元组作为唯一参数。

有没有办法重写它,这样无论有多少参数,我都可以抽象函数的参数? 理想情况下,编译器的解决方案是类型安全的。

也许我在创建实例时可以使用元组来指定包装器的类型。

我希望我不必像 Tuple 类 Tuple2 到 TupleN 或 Function2 到 FunctionN 那样写它。我不知道这方面的所有细节,但这看起来更像是一种解决方法,而不是一个抽象/通用的解决方案。

【问题讨论】:

  • 你可以在函数上使用tupled方法:new Wrapper(multiplyFunction.tupled)
  • 我不知道元组。它编译。 :) 需要更多时间来检查运行时行为。有没有办法让它对包装类的用户透明。我的意思是用户可以传递一个普通函数,我内部调用tupled?
  • 查看答案。评论太长了。

标签: scala generics functional-programming abstract type-parameter


【解决方案1】:

您可以在函数上使用tupled 方法:new Wrapper(multiplyFunction.tupled)

如果你想让这个对包装类的用户透明,你可以使用鸭子类型:

object Wrapper {
  def apply[I, O](e: { def tupled: I => O }) = new Wrapper(e.tupled)
  def apply[I, O](e: I => O) = new Wrapper(e)
}

scala> Wrapper( (a: Int) => a )
res0: Wrapper[Int,Int] = Wrapper@29d03e78

scala> Wrapper( (a: Int, b: Int) => a * b )
res1: Wrapper[(Int, Int),Int] = Wrapper@581cdfc2

由于反射,您会得到一些开销。

【讨论】:

  • 棘手,但它编译到目前为止。 ^^
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2017-08-04
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多