代码之家  ›  专栏  ›  技术社区  ›  HoTicE

标量元组函数组合

  •  3
  • HoTicE  · 技术社区  · 8 年前

    假设我们有3个函数 Tuple3

    def foo(a: String, b: String, c: String): (String, String, String) = {
      (s"foo_$a", s"foo_$b", s"foo_$c")
    }
    
    def bar(a: String, b: String, c: String): (String, String, String) = {
      (s"bar_$a", s"bar_$b", s"bar_$c")
    }
    
    def buz(a: String, b: String, c: String): (String, String, String) = {
      (s"buz_$a", s"buz_$b", s"buz_$c")
    }
    

    我可以这样写:

    val (a, b, c) = foo("1", "2", "3")
    val (d, e, f) = bar(a, b, c)
    val (g, h, i) = buz(d, e, f)
    

    但我想要这样的东西:

    val (x, y, z) = foo(bar(buz("1", "2", "3")))
    

    3 回复  |  直到 8 年前
        1
  •  4
  •   jwvh    8 年前

    我想这就是你想要的。

    foo _ tupled(bar _ tupled buz("1", "2", "3"))
    // res0: (String, String, String) = (foo_bar_buz_1,foo_bar_buz_2,foo_bar_buz_3)
    

    首先,使用eta扩展( _ )将方法转换为 Function tupled() 方法,该方法获取一个元组并将其转换为所需的参数。

        2
  •  3
  •   Luka Jacobowitz    8 年前

    为了便于键入,假设定义了以下类型别名:

    type String3 = (String, String, String)
    

    andThen compose 正如sheunis所说,你可以 Function3[String, String, String, String3] Function1[String3, String3] 使用 tupled 作用

    val buzBarFoo = (buz _ tupled) andThen (bar _ tupled) andThen (foo _ tupled)
    

    或者这个:

    val buzBarFoo = (foo _ tupled) compose (bar _ tupled) compose (buz _ tupled)
    

    它们都具有上述类型的 功能1[String3,String3]

    val (x, y, z) = buzBarFoo("1", "2", "3")
    
        3
  •  1
  •   sheunis    8 年前
    def foo(arg: (String, String, String)): (String, String, String) = {
      (s"foo_${arg._1}", s"foo_${arg._2}", s"foo_${arg._3}")
    }
    
    def bar(arg: (String, String, String)): (String, String, String) = {
      (s"bar_${arg._1}", s"bar_${arg._2}", s"bar_${arg._3}")
    }
    
    def buz(arg: (String, String, String)): (String, String, String) = {
      (s"buz_${arg._1}", s"buz_${arg._2}", s"buz_${arg._3}")
    }
    
    val (a, b, c) = foo("1", "2", "3")
    val (d, e, f) = bar(a, b, c)
    val (g, h, i) = buz(d, e, f)
    
    val newFunc = foo _ andThen bar andThen buz
    newFunc("1", "2", "3")
    

    有两个功能, andThen compose Function1 ,可以通过将元组传递给方法来创建。