使用映射将函数应用于列表列表的困难

时间:2015-04-15 00:35:46

标签: scheme

我正在尝试使用自己的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)

1 个答案:

答案 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?更有效。