【问题标题】:Is append the identity function for map?是为地图附加身份功能吗?
【发布时间】:2021-06-15 00:44:00
【问题描述】:

在做一些测试时,我注意到append 在使用map 时总是给我与输入相同的输出:

#lang sicp
(map append '(1 2 3 4 5))
(map (lambda (x) x) '(1 2 3 4 5))
; (1 2 3 4 5)
; (1 2 3 4 5)
(map append '((1 2)(3 4)))
(map (lambda (x) x) '((1 2)(3 4)))
; ((1 2) (3 4))
; ((1 2) (3 4))

这对我来说似乎很整洁/出乎意料。事实是这样吗?如果是这样,append 如何提供身份属性?

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    append 过程采用零个或多个 列表参数,最后一个参数 可以是任何对象。当最后一个参数是一个列表时,追加的结果是一个正确的列表。当最后一个参数不是列表,但已经提供了其他列表参数时,结果是一个不正确的列表。当只提供一个参数时,它只是被返回。这种带有一个参数的行为正是身份过程的行为。

    > (append '(1 2) '(3))
    (1 2 3)
    > (append '(1 2) 3)
    (1 2 . 3)
    > (append '(1 2))
    (1 2)
    > (append 3)
    3
    

    调用(map append '(1 2 3 4 5))相当于:

    > (list (append 1)
            (append 2)
            (append 3)
            (append 4)
            (append 5))
    (1 2 3 4 5)
    

    这里,append 只是作为一个身份过程,如上所述。

    【讨论】:

    • 再次感谢。你的答案太棒了,你是所有 FP 知识的天才。除了在 SICP 中苦苦挣扎之外,您是如何做到如此出色的 / 任何建议?
    • 感谢您的好话;) SICP 很棒;几年前,我阅读了 Bird 和 Wadler 的一本关于函数式编程的书,这本书非常好,也很有帮助。我现在不记得标题了;那本书使用了属于 Haskell 早期血统的 Miranda 编程语言。那本书的最新版本使用了 Haskell。我建议花一点时间使用 SML 或 Haskell 中的一个或两个,以获得对函数式编程的不同看法。然后你只需要继续练习......
    • 我有数学背景,当我第一次开始涉足函数式编程时,这似乎是一种非常自然的思考问题的方式,例如递归和转换,这要归功于我之前在数学方面的工作。如果您还没有学习过离散数学和数学证明的基础知识,例如归纳证明技术,那么这些内容也会很有帮助。
    • 哦,您应该至少阅读一个 Scheme RnRS 标准。这些是语言规范的绝佳示例,您将更好地了解语言保证与实现的行为方式。它们都不是很长,即使是 R6RS。
    • @adabsurdum 这本书是“函数式编程简介”。对于一本好书来说,这不是最令人难忘的标题。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多