复合数据

不打扰是莪最后的温柔 提交于 2020-01-31 01:13:54

复合数据

本文基于 SICP 2.4 - 2.6,介绍三种另类的数据存储结构。

函数工厂

构造函数

(define (cons x y)
  (lambda (m) (m x y)))

构造函数返回的是一个“装饰器”,它完成如下映射:
ff(x,y) f\mapsto f(x,y)
实际上是把数据存在了函数闭包里,数据提取函数只要传入返回相应参数的函数就可以了。

左提取

(define (car z)
  (z (lambda (p q) p)))

右提取

(define (cdr z)
  (z (lambda (p q) q)))

用例

> (car (cons 109 77))
109

因式分解

可以建立一个数到序对的双射吗?至少对于正整数是可以的:
(a,b)2a3b (a,b)\leftrightarrow 2^a3^b
质因数分解的结果是唯一的,可以用来实现2a3b(a,b)2^a3^b\mapsto (a,b)

代码

使用sumpy数论库:

from sympy.ntheory import factorint

class pair:
    
    def __init__(self, a, b):
        self.hash = (2**a) * (3**b)
    
    def car(self):
        return factorint(self.hash)[2]
    
    def cdr(self):
        return factorint(self.hash)[3]

用例

p = pair(6, 12)
p.hash
> 34012224
p.car()
> 6

Church 计数

λ\lambda演算模拟自然数,nn被写为:
ffn f\mapsto f^n

零的定义

(define zero (lambda (f) (lambda (x) x)))

f0=xxf^0=x\mapsto x

加1

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

加法

(define (add a b)
  (lambda (f)
    (lambda (x)
      ((a f) ((b f) x)))))
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!