Little Schemer:仅支持长度≤2的列表的写函数

jiamo

The little schemer一书中,我们发现此功能仅支持长度小于或等于1的列表

 (((lambda (mk-length)                                  ; A.
      (mk-length mk-length))
  (lambda (mk-length)
      (lambda (l)
          (cond
              ((null? l ) 0)
              (else (add1 ((mk-length  eternity ) (cdr l))))))))
 '(1))

我想一步一步学习,并想编写类似的函数,仅支持长度小于或等于2的列表

请不要通过提供以下代码来回答这个问题:

(((lambda (mk-length)                                   ; B.
      (mk-length mk-length))
  (lambda (mk-length)
      (lambda (l)
          (cond
              ((null? l) 0 )
              (else (add1((mk-length mk-length) (cdr l))))))))
 '(a b c d))

因为此功能支持任何长度。

而且我已经知道如何编写这样的函数:

(((lambda (mk-length)                                   ; C.
      (mk-length
          (mk-length (mk-length eternity))))
  (lambda (length)
      (lambda (l)
          (cond
              ((null? l) 0)
              (else (add1 (length (cdr l))))))))
 '(1 2)) ;;

实现我的目标。但是,这段代码与第一个代码片段相距仅一步之遥。

也许,我不应该更改:

(lambda (mk-length)                                     ; D.
      (mk-length mk-length)
内斯

TL; DR: 内部形式)计算,对于长度的列表作品功能0,并且将使用来计算将被用于工作在尾部函数(即的结果参数列表的)。(mk-length A)condlength(A A)length(cdr ...)


您的第一个代码段(;A.)仅适用于长度为01的列表为了使工作2还,替换

                               (mk-length eternity)               ; length≤1

                               (mk-length   ; (2)                 ; length≤2
                                  (lambda (x) (mk-length eternity)))

作品。

(注意:(mk-length eternity)本身进行计算length≤0,但是整体功能变为length≤1是所有其他length≤i注释所指的内容。)

仔细看

     (((lambda (mk-length)
          (mk-length mk-length))            
      (lambda (mk-length)                   ; (1)
          (lambda (l)                       
              (cond
                  ((null? l ) 0)
                  (else (add1 ((mk-length   ; (2)                 ; length≤2
                                  (lambda (x) (mk-length eternity)) )
                               (cdr l))))))))
     '(1 2))

我们可以看到,at的结果用于处理,而to at在处理时替换为该调用(mk-length ...);(2)(cdr l)argumentmk-length;(2)mk-length(cddr l)

如果使用(如您的第一个代码),则可以正常处理,但自然会失败。(mk-length eternity)(cdr l)((eternity eternity) (cddr l))

如果使用,则处理正常,然后用于处理也正常的(因此长度2被正确处理),然后自然失败(对于长度3及以上)。(mk-length (lambda (x) (mk-length eternity)))(cdr l)((lambda (x) (mk-length eternity)) (lambda (x) (mk-length eternity))) = (mk-length eternity)(cddr l)((eternity eternity) (cdddr l))

因此,要处理最多三个元素的列表,

                              ((mk-length   ; (2)                 ; length≤3
                                  (lambda (x) (mk-length 
                                                (lambda (x) (mk-length eternity)))) )

可以使用:

    (define (eternity x) (- 1))    ; to get an error instead of looping

    (((lambda (mk-length)
          (mk-length mk-length))
      (lambda (mk-length)
          (lambda (l)
              (cond
                  ((null? l ) 0)
                  (else (add1 ((mk-length   ; (2)                 ; length≤3
                                  (lambda (x) (mk-length
                                               (lambda (x) (mk-length eternity)))) )
                               (cdr l))))))))

      '(1 2 3))        ; => 3

    ; ...........
    ; '(1 2 3 4))      ; => **error**

如您正确推测的那样,是使用过程中的过渡步骤

                     (mk-length (lambda (x) (mk-length x)))   ; (2)       ; length≤∞

接下来,将列表的下一个元素处理为

                     ((lambda (x) (mk-length x)) (lambda (x) (mk-length x)))
    =
                     (mk-length (lambda (x) (mk-length x)))

因此适用于每个列表,无论其长度如何。

通过eta转换,这就是(mk-length mk-length)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Little Schemer中原始函数的范围是否错误?

“映射” Little Schemer应对编码字节挑战:大写

Little Schemer:为什么将(mk-length mk-length)包装为一个函数?

Big Endian和Little Endian支持字节排序

为什么python的结构认为little-endian和big-endian暗示了不同的长度?

我可以在Mac OS X上通过CLI处理Little Snitch访问控制列表吗?

使用python错误将'UCS-2 Little Endian'文件编码为'utf8'

LMC-有效地检查Little Man Computer Assembly中的a ^ 2 + b ^ 2 = c ^ 2

Little Endian和nasm推送

Little Endian与Big Endian架构

[Little Schemer Ch3 pp.34&37]:为什么在第37页的示例中,(rember a(cdr lat))作为cons的第二个参数解释为未知

(java)在文件little endian中写入

将Little Endian转换为Big Endian

检查系统为Little Endian或Big Endian

Fermat的Little定理在R中的实现

OSX-Tor Guard和Little Snitch

Haskell函数的列表长度

Powershell 等效于简单的 Perl 正则表达式搜索,替换一个 liner 以在 UCS-2LE 或 UTF-16 Little Endian 文件中查找替换

将数据发送到Little Endian的串行端口

想要使用标签简化Little Man Computer Program BubbleSort

Little Main Computer程序来显示商,然后是余数

Little Man Computer仍然有意义吗?

为什么std :: bitset以Little-Endian方式公开位?

如何从长指针中提取 little-endian unsigned short?

在 PHP 中解压签名的 int32 little-endian

字符串是否始终是Little Endian Unicode?

Little Man Computer Program输出1,延迟5秒

完全删除Little Snitch(Mac OS X Snow Leopard)

麻烦理解little-o表示法示例