Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-4998

Real currying support

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • 4.x
    • groovy-jdk
    • None

    Description

      Hi.

      Groovy's Closure have a name of method 'curry'.
      But this is not work for a real currying, it work as a partial function application.
      So, I wrote method of 'Real currying'.

      Referenced http://en.wikipedia.org/wiki/Currying

      Closure add = {a, b, c -> a + b + c } // Closure of adding 3 arguments.
      
      assert add(1, 2, 3) == realCurry(add)(1)(2)(3)
      assert 6 == add(1, 2, 3)
      def curriedAdd = realCurry(add)
      def curriedAdd_1 = curriedAdd(1)
      def curriedAdd_1_2 = curriedAdd_1(2)
      def addResult = curriedAdd_1_2(3)
      assert 6 == addResult
      
      def realCurry(Closure clos) {
        if (clos.maximumNumberOfParameters >= 1) {
          return { x ->
            def cc = clos.curry(x)
            if (cc.maximumNumberOfParameters) realCurry(cc)
            else cc()
          }
        } else {
          return clos
        }
      }
      

      (It's also published on gist https://gist.github.com/1193548)

      I hope this will be adopted to Groovy core.

      Thank you.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              fumokmm Kentaro Yoshida
              Votes:
              0 Vote for this issue
              Watchers:
              9 Start watching this issue

              Dates

                Created:
                Updated: