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

Difficulties with applying a function to a list of lists using mapping

我正在尝试使用我自己的映射函数将函数 f 映射到列表 L 的列表。问题是程序没有 运行。我想我犯了某种语法错误。然而,这可能与 cond 的误用或什至是对映射列表列表的想法的误解有关。

我在函数式编程和 Scehme 语言方面没有经验,这就是我无法自行解决的原因。我已尝试 different ways of conditioning 并在 Whosebug 中搜索类似问题,但我可以找到任何解决方案。

这是我的代码。我添加了一些评论来向您展示我对这个功能的看法。

(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)

程序没问题,正如评论中提到的,样本输入有问题。试试这个:

(mapp fun '(1 2 3 (4 3 2) 6 (0 2) 9))
=> '(1 4 9 (16 9 4) 36 (0 4) 81)

您忘记了列表开头的 '(一个 quote)!此外,我们可以做一个小的(但依赖于实现)优化:在你的代码中用 pair? 替换 list?,在一些解释器中 pair?list? 更有效。