Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you create scala anonymous function with multiple implicit parameters

Tags:

scala

I have scala functions called "run1" and "run2" which accept 3 parameters. When I apply them I want to provide an anonymous function with implicit parameters. It doesn't work in both cases in example codes below. I want to know if

  1. Is that even possible?
  2. If it is possible, what's the syntax?



       object Main extends App {
          type fType = (Object, String, Long) => Object

          def run1( f: fType ) {
            f( new Object, "Second Param", 3)
          }

          run1 { implicit (p1, p2, p3) => // fails
            println(p1)
            println(p2)
            println(p3)
            new Object()
          }

          def run2( f: fType ) {
            val fC = f.curried
            fC(new Object)("Second Param")(3)
          }

          run2 { implicit p1 => implicit p2 => implicit p3 => // fails
            println(p1)
            println(p2)
            println(p3)
            new Object()
          }
        }

like image 352
Michael Avatar asked Jul 18 '13 02:07

Michael


1 Answers

You're currying the function inside run2 so run2 still needs a non-curried function. See the code below for a version that works:

object Main extends App {
  type fType = (Object, String, Long) => Object
  type fType2 = Object => String => Long => Object //curried

  def run1( f: fType ) {
    f( new Object, "Second Param", 3)
  }

  // Won't work, language spec doesn't allow it
  run1 { implicit (p1, p2, p3) => 
    println(p1)
    println(p2)
    println(p3)
    new Object()
  }

  def run2( f: fType2 ) {
    f(new Object)("Second Param")(3)
  }

  run2 { implicit p1 => implicit p2 => implicit p3 =>
    println(p1)
    println(p2)
    println(p3)
    new Object()
  }
}
like image 194
Noah Avatar answered Nov 26 '22 09:11

Noah