【问题标题】:How to convert this function to an inline call如何将此函数转换为内联调用
【发布时间】:2023-04-05 17:45:01
【问题描述】:

我有以下函数来缩放(2-col)矩阵:

(define (scale-matrix matrix scale)
  (map (lambda (row)
         (list (* scale (car row))
               (* scale (cadr row))))
       matrix))

(scale-matrix '((1 2) (3 4)) 3)
; ((3 6) (9 12))                       

但是,我很难将其转换为内联咖喱调用。这是我目前所处的位置:

(map
 (lambda (row)
   (lambda (scale)
     (list (* scale (car row))
           (* scale (cadr row)))))
 '((1 2) (3 4)))
; (#<procedure:...esktop/sicp/021.scm:54:3> #<procedure:...esktop/sicp/021.scm:54:3>)

在这里传递比例和矩阵的正确方法是什么?换句话说,3 放在哪里?

到目前为止,我最接近的方法是将3 硬编码在其中:

(map
 (lambda (row)
   ((lambda (scale)
      ; 3 hardcoded, nil placeholder. How to actually 'call' with 3?
      (list (* 3 (car row)) (* 3 (cadr row)))) nil)) 
 '((1 2) (3 4)))

或者,我是否需要将scale 作为第一个参数传递?它似乎以这种方式工作,但不确定是否需要这样做(甚至不确定为什么会这样!)

((lambda (scale)
  (map (lambda (row)
         (list (* scale (car row)) (* scale (cadr row))))
         '((1 2) (3 4)))) 3)

; ((3 6) (9 12))

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    您的最后一次尝试是正确的:您必须提取用于scalelambda map 调用之外。你不能修改最里面的 lambda,map 需要一个带有一个参数的 lambda,你不能在那里传递一个嵌套的 lambda。所以如果你想咖喱scale,别无选择,但:

    ((lambda (scale)
       (map (lambda (row)
              (list (* scale (car row))
                    (* scale (cadr row))))
            '((1 2) (3 4))))
     3)
    => '((3 6) (9 12))
    

    至于为什么它起作用,就像任何其他匿名lambda 电话一样。让我们看一个更简单的例子,这个:

    (define (add1 n)
      (+ 1 n))
    
    (add1 41)
    

    评估时等价于:

    ((lambda (n)
       (+ 1 n))
     41)
    

    顺便说一句,上面也是let 的扩展和评估方式:

    (let ((n 41))
      (+ 1 n))
    

    所以你也可以内联代码,如下所示;但是你为什么要咖喱呢?原来的代码加上程序就对了。

    (let ((scale 3))
      (map (lambda (row)
             (list (* scale (car row))
                   (* scale (cadr row))))
           '((1 2) (3 4))))
    

    【讨论】:

    • 感谢您。至于为什么,我只是在玩弄柯里化并试图了解它是如何工作的。
    猜你喜欢
    • 2012-10-20
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2014-10-13
    • 2016-01-01
    • 2020-09-03
    相关资源
    最近更新 更多