【问题标题】:Currying a function n times in Scheme在 Scheme 中对函数进行 n 次柯里化
【发布时间】:2012-11-27 04:29:14
【问题描述】:

我在想办法将函数柯里化指定次数时遇到了麻烦。也就是说,我给函数一个自然数n和一个函数fun,它对函数进行了n次curry。例如:

(curry n fun)

功能和可能的应用是:

(((((curry 4 +) 1) 2) 3) 4)

这将产生 10。

我真的不确定如何正确实施它。有人可以帮帮我吗?谢谢:)

【问题讨论】:

    标签: lambda scheme currying


    【解决方案1】:

    你可以通过反复调用curry来编写自己的n-curry过程:

    (define (n-curry n func)
      (let loop ([i 1] [acc func])
        (if (= i n)
            acc
            (loop (add1 i) (curry acc)))))
    

    如果您在 Racket 中,可以使用 for/fold 迭代更简单地表示:

    (define (n-curry n func)
      (for/fold ([acc func])
        ([i (in-range (sub1 n))])
        (curry acc)))
    

    无论如何都要这样使用:

    (((((n-curry 4 +) 1) 2) 3) 4)
    => 10
    

    【讨论】:

      【解决方案2】:
      ;;; no curry
      ;;; (Int, Int, Int) => Int
      
      (define sum
        (lambda (x y z)
          (+ x y z) ) )
      
      (sum 1 2 3)
      
      ;;; curry once
      ;;; (Int) => ((Int x Int) => Int)
      
      (define sum
        (lambda (x)
          (lambda (y z)
            (+ x y z) ) ) )
      
      (define sum+10 (sum 10))
      
      (sum+10 10 20)
      
      ;;; curry 2 times
      ;;; (Int) => (Int => (Int => Int) )
      
      (define sum
        (lambda (x)
          (lambda (y)
            (lambda (z)
              (+ x y z) ) ) ) )
      
      (define sum+10+20 ((sum 10) 20))
      
      (sum+10+20 30)
      

      ;;;现在我们将从这些示例开始进行概括:

      (define (curry n f)
        (if (= n 0)
            (lambda (x) x)
            (lambda (x) (f ((curry (- n 1) f) x)))))
      

      ;;;示例:对初始数字 10 应用函数 1+ 11 次,结果为 21:

      ((curry 11 (lambda (x) (+ x 1))) 10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-17
        • 2010-10-16
        • 2010-11-29
        • 1970-01-01
        • 2011-11-02
        • 2011-04-14
        • 1970-01-01
        • 2016-01-01
        相关资源
        最近更新 更多