我目前在创建func时遇到了问题,并且是Scheme的初学者。为了达到这样的结果,我是否必须在func中定义double?
(func double 3 '(3 5 1))
将返回(24 40 8),因为每个元素加倍3次。
答案 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)))