球拍/多个功能

时间:2015-02-09 04:58:57

标签: scheme racket

我该如何解决这个问题?

给定arity 1和list的函数,返回将函数应用于原始列表的每个元素的列表。例如:

(Mmap add1 '(1 2 3 4))                        ; -> '(2 3 4 5)
(Mmap car '((1 2 3) (4 5 6) (7 8 9)))         ; -> '(1 4 7)
(Mmap cdr '((1 2 3) (4 5 6) (7 September 8))) ; -> '((2 3) (5 6) (8 9))

我已经尝试过cond和其他类似的功能,但我真的不知道如何解决它。

2 个答案:

答案 0 :(得分:1)

(define (myfunc f alist)
  (cond
    [(empty? alist) empty]
    [else (cons (f (first alist)) (myfunc f (rest alist)))]
    ))

f是您的功能(例如add1,car),alist是您的参数。您所要做的就是构建一个列表,在其中将f应用于您的第一个参数,并将列表的其余部分递归追加到该列表中。

关于你的上一个例子。我假设9月被定义为(define September 8)。在这种情况下,您的示例不会为您提供所需的输出。最后一个列表将包含'September而不是8,因为您使用'()声明了您的列表,该列表将名称视为符号。

此外,如果'((2 3) (5 6) (8 8))返回列表的第二个和后续元素,则输出应为cdr。因此,您可能希望将(list 7 September 9)作为输入中的最后一个列表,以便获得'((2 3) (5 6) (8 9))

您必须按以下方式调用此函数:(myfunc cdr (list (list 1 2 3) (list 4 5 6) (list 7 September 9)))

编辑:显然将9月定义为9是最有意义的,因为它是一年中的第9个月,并且调用这样的函数:(myfunc cdr (list (list 1 2 3) (list 4 5 6) (list 7 8 September)))

答案 1 :(得分:-1)

Mmap可以根据#lang racket的函数map进行定义。

 (define Mmap map)