我该如何解决这个问题?
给定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和其他类似的功能,但我真的不知道如何解决它。
答案 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)