【问题标题】:Where is the argument coming from?论据从何而来?
【发布时间】:2021-10-01 07:13:23
【问题描述】:

你可以注意到函数体中lambda中的v,v是从哪里来的,它是基于什么的?

(define (cached-assoc xs n)
  (letrec ([memo (make-vector n #f)]
           [acc 0]
           [f (lambda(x)
                (let ([ans (vector-assoc x memo)])
                  (if ans
                      (cdr ans)
                      (let ([new-ans (assoc x xs)])
                       (begin
                         (vector-set! memo acc (cons x new-ans))
                         (set! acc (if (= (+ acc 1)) 0 (+ acc 1)))
                         new-ans)))))])
  (lambda (v) (f v))))

【问题讨论】:

    标签: function lambda arguments racket programming-languages


    【解决方案1】:

    整个表达式返回一个lambda 作为结果,而在lambda 中有一个名为v 的形参。它还没有值,您需要调用lambda 将值绑定到v 并生成结果(假设代码正在运行):

    ((letrec ([memo (make-vector n #f)] ; notice the extra opening `(`, we want to call the returned lambda
              [acc 0]
              [f (lambda(x)
                   (let ([ans (vector-assoc x memo)])
                     (if ans
                         (cdr ans)
                         (let ([new-ans (assoc x xs)])
                           (begin
                             (vector-set! memo acc (cons x new-ans))
                             (set! acc (if (= (+ acc 1)) 0 (+ acc 1)))
                             new-ans)))))])
       (lambda (v) (f v)))
     10) ; <- the value 10 gets bound to `v`
    

    但是,您的代码不正确。您指的是名为nxs 的变量,但它们没有在任何地方定义,需要它们自己的值。过程vector-assoc 不存在。此外,末尾的lambda 是多余的,您可以简单地返回f,无需将其包装在额外的lambda 中。最后:你应该define整个表达式加上一个名字,这样更容易调用。

    我不会详细说明,因为首先您需要修复该功能并使其工作,并且完全不清楚您想要做什么 - 但这应该是一个单独的问题。

    【讨论】:

    • 你说得对,我这里写错了,我现在已经改正了,希望你现在可以复习一下。
    • @Amen 但我已经回答了你的问题 :) 该过程返回另一个过程, v 未绑定在此过程中,它只会在您调用它时从“外部”获取一个值。如果您需要进一步的帮助来修复程序本身,请发布一个新问题,说明您希望它做什么,包括示例输入和预期输出。
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2011-01-09
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多