首页 > 解决方案 > 以语法一致的方式将 args 传递给 n 个参数的 fns

问题描述

Scalaz 有一个画眉操作符,|>定义如下:

implicit class ThrushOps[A](self: A) {
  def |>[B](f: A ⇒ B): B = f(self)
}

我有几个不同参数的函数:

def f1(x:Int)=x+1
def f2(a:Int, b:Int)=(a+1,b+1)
def f3(a:Int, b:Int, c:Int)=(a+1,b+1,c+1)

如果它们有 1 个或多个 args,我可以调用它们的方式在语法上是不同的:

4 |> f1
(1,2) |> (f2 _).tupled
(1,2,3) |> (f3 _).tupled

从句法的角度来看,有什么方法可以使调用带有一个参数的函数与调用带有 n 个参数的函数一致?

我希望能够写作

4 |> f1
(1,2) |> f2

标签: scalafunctional-programming

解决方案


使用适用:

implicit class ThrushOps[A](self: A) {
  def |>[B](f: A ⇒ B): B = if (self.isInstanceOf[Product]) f.apply(self) else f(self)
}

您还可以使用清单来执行更准确的检查


推荐阅读