【问题标题】:n-ary function in scheme方案中的 n 元函数
【发布时间】:2015-05-15 16:58:09
【问题描述】:

我正在为我的 CS 课程写作业。我必须基于另一个名为 chili 的函数编写一个 n 元函数,该函数接受 3 个参数和一个运算符作为输入,并返回与运算符组合的变量,如下所示:

> ((((Chili3 +) 1) 10) 100)
111

还有代码:

(define Chili3
  (lambda (p)
    (lambda (x1)
      (lambda (x2)
        (lambda (x3)
          (p x1 x2 x3))))))

我应该编写的函数必须接受另一个输入,它定义了函数将使用的参数数量,并将像这样执行:

> ((((((Curry 5 *) 1) 2) 3) 4) 5)
120

这是我到目前为止的代码:

(define Chili
  (lambda (n p)
    (lambda(xs)
    ((p n) xs))))

谁能帮助我,也许只是解释一下 n 元函数是如何工作的,或者我的代码有什么问题?

【问题讨论】:

    标签: lambda scheme currying


    【解决方案1】:

    这是我的看法。

    (define (curry-n n proc)
      (let curry-n-aux ((n n) (args '()))
        (if (zero? n)
            (apply proc (reverse args))
            (lambda (x)
              (curry-n-aux (- n 1) (cons x args))))))
    
    (curry-n 0 (lambda () "hello"))  ; ==> "hello"
    ((curry-n 1 values) "hello")     ; ==> "hello"
    ((((((curry-n 5 *) 1) 2) 3) 4) 5); ==> 120
    

    另一种方法是有一个适用的特殊“应用”值:

    (define %curry-apply (list 'apply))
    (define (curry proc)
      (let curry-n-aux ((args '()))
        (lambda (x)
          (if (eq? x %curry-apply)
              (apply proc (reverse args))
              (curry-n-aux (cons x args))))))
    
    ((curry-n (lambda () "hello")) %curry-apply)  ; ==> "hello"
    (((curry-n values) "hello") %curry-apply)     ; ==> "hello"
    (((((((curry-n *) 1) 2) 3) 4) 5) %curry-apply); ==> 120
    

    【讨论】:

      【解决方案2】:

      这是一个简单的函数,它接受任意数量的参数。 点表示它是一个 n 元函数。

      (define (plus . xs)
        (define n (length xs))
        (display "The number of arguments were: ")
        (display n)
        (newline)
        (apply + xs))
      
      (plus)
      (plus 1)
      (plus 1 2)
      (plus 1 2 3)
      

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        相关资源
        最近更新 更多