【问题标题】:Scheme - nested definition confusionScheme - 嵌套定义混淆
【发布时间】:2014-05-30 06:33:54
【问题描述】:

我目前在创建 func 时遇到问题,并且是 Scheme 的初学者。为了达到这样的结果,我必须在 func 中定义 double 吗?

(func double 3 '(3 5 1)) 

将返回 (24 40 8),因为每个元素都加倍了 3 次。

【问题讨论】:

  • 你能把你的问题说清楚一点吗?

标签: scheme racket


【解决方案1】:

如果我正确理解您的问题,您可以通过以下方式实现func

(define (func f n lst)
  (do ((n n (sub1 n))
       (lst lst (map f lst)))
      ((zero? n) lst)))

示例用法:

> (func (lambda (x) (* x 2)) 3 '(3 5 1))
=> (24 40 8)

【讨论】:

    【解决方案2】:
    #lang racket
    
    (define (repeat f x n)
      (cond [(= n 0) x]
            [else    (f (repeat f x (- n 1)))]))
    
    (define (func f n xs)
      (map (λ(x) (repeat f x n)) xs))
    
    (define (double x) 
      (* 2 x))
    
    (func double 3 '(3 5 1))
    

    【讨论】:

    • 有趣地比较和对比你的方法:你用一个重复的函数映射一次,而我用原始函数映射多次。 :-)
    • 不错的观察。重读 OP 的问题,我想我们都忘了回答如何定义 double :-) 我们专注于 func。
    • 好吧,如果您从字面上理解这个问题,OP 想要定义 func,并想知道是否必须在其中定义 double。答案当然是否定的,这两个答案都证明了这一点。
    【解决方案3】:

    可能是这样的:

    (define (cmap fun arg1 lst)
      (map (lambda (x) (fun arg1 x)) lst))
    

    但你真的想这样做(cmap list 1 (get-some-calc x) (get-list)) 但很难让它接受任何咖喱论点,也许你想要多个列表。你这样做:

    (let ((cval (get-come-calc x)))
      (map (lambda (x) (list 1 cval x)) (get-list)))
    

    【讨论】:

      【解决方案4】:

      不,double 需要在func 之外,因为它将作为参数(绑定到f)传递给func

      (define (double n) (* 2 n))
      
      (define (times f e t)
        (if (= t 0)
            e
            (times f (f e) (- t 1))))
      
      (define (func f t lst)
        (map (lambda (e) (times f e t)) lst))
      

      然后

      > (func double 3 '(3 5 1)) 
      '(24 40 8)
      

      OTOH,在这种情况下,times 可以在 func 中定义,但它是一个可重用的过程,所以我将它留在外面。

      【讨论】:

      • 您可以将符号 'double 作为消息传递,并具有内部调度和定义,特别是如果 func 要保持任何内部状态。
      • 我没有看到内部调度的意义,很抱歉,如果func 有某种状态,我认为没有必要这样做。你能详细说明一下吗?
      • 如果您保留一个内部调度表或 alist,您可以避免命名空间冲突,但保留一种扩展可用功能的方法,例如双字符串的函数,或将任何内部函数应用于树和向量。也许您想在每次传入特定消息时增加一个计数器。
      • 是的,可能不是这里需要的,但消息传递可能非常有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2012-04-11
      • 1970-01-01
      相关资源
      最近更新 更多