我正在尝试使用自己的map函数将函数f映射到列表L列表。问题是程序没有运行。我想我已经犯了一些语法错误。然而,它可能与误用cond
有关,甚至误解了映射列表列表的想法。
我在函数式编程和Scehme语言方面没有经验,这也是我无法独立解决的原因。我已经尝试了different ways of conditioning并在StackOverflow中搜索了类似的问题,但我找到了任何解决方案。
这是我的代码。我已经添加了一些评论来向您展示我对此功能的看法。
(define (mapp f L)
(cond
[(null? L) '()] ; if L is empty
[(list? (car L)) ; if the head of L is a list
(cons
(mapp f (car L)) ; do mapp for the head of L which is a list
(mapp f (cdr L)) ; do mapp for the tail of L
)]
[else (cons
(f (car L)) ; do f for the head which is a number
(mapp f (cdr L)) ; do mapp for the tail of L
)]
)
)
(define (fun a)
(expt a 2)) ; I chose expt function just to see if something changes
(display
(mapp fun (1 2 3 (4 3 2) 6 (0 2) 9) )
;I expect the output to be (1 4 9 (16 9 4) 36 (0 4) 81)
答案 0 :(得分:3)
程序没问题,如评论中所述,样本输入存在问题。试试这个:
(mapp fun '(1 2 3 (4 3 2) 6 (0 2) 9))
=> '(1 4 9 (16 9 4) 36 (0 4) 81)
您忘记了列表开头的'
(quote)了!此外,我们可以执行一个小的(但依赖于实现的)优化:在代码中将list?
替换为pair?
,在某些解释器中pair?
将比list?
更有效。