Scheme - 嵌套定义混淆

时间:2014-04-15 18:29:41

标签: scheme racket

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

(func double 3 '(3 5 1)) 

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

4 个答案:

答案 0 :(得分:2)

不,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内定义,但它是一个可重复使用的程序,因此我将其留在外面。

答案 1 :(得分: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 :(得分:1)

#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))

答案 3 :(得分:0)

可能是这样的:

(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)))