这是一个非常广泛的问题,有很多自以为是的答案,但G_H提供了一些非常好的细分
你能详细说明“纯功能数据结构通过函数对计算本身建模吗?”?
这是我最喜欢的主题之一,所以我很高兴在JavaScript中分享一个示例,因为它允许您在浏览器中运行代码并查看自己的答案
您将在下面看到使用的链接列表 功能 。我使用一些数字作为示例数据,我使用一个字符串,以便我可以将某些内容记录到控制台供您查看,但除此之外,它只是 功能 C没有花哨的物品,没有阵列,没有其他自定义的东西。
const cons = (x,y) => f => f(x,y) const head = f => f((x,y) => x) const tail = f => f((x,y) => y) const nil = () => {} const isEmpty = x => x === nil const comp = f => g => x => f(g(x)) const reduce = f => y => xs => isEmpty(xs) ? y : reduce (f) (f (y,head(xs))) (tail(xs)) const reverse = xs => reduce ((acc,x) => cons(x,acc)) (nil) (xs) const map = f => comp (reverse) (reduce ((acc, x) => (cons(f(x), acc))) (nil)) // this function is required so we can visualise the data // it effectively converts a linked-list of functions to readable strings const list2str = xs => isEmpty(xs) ? 'nil' : `(${head(xs)} . ${list2str(tail(xs))})` // example input data const xs = cons(1, cons(2, cons(3, cons(4, nil)))) // example derived data const ys = map (x => x * x) (xs) console.log(list2str(xs)) // (1 . (2 . (3 . (4 . nil)))) console.log(list2str(ys)) // (1 . (4 . (9 . (16 . nil))))
当然,这在现实世界的JavaScript中并没有实际应用,但这不是重点。它只是向你展示 怎么样 单独的函数可用于表示复杂的数据结构。
这是另一个使用函数和数字来实现有理数的例子 C再次,我们只使用字符串,所以我们可以将函数结构转换为我们在控制台中可以理解的直观表示 - 这个确切的场景在SICP中进行了彻底的检查G_H提到的那本书
我们甚至实现了更高阶的数据 rat 运用 cons 。这显示了功能数据结构如何可以很容易地由其他功能数据结构组成(由其组成)
rat
cons
const cons = (x,y) => f => f(x,y) const head = f => f((x,y) => x) const tail = f => f((x,y) => y) const mod = y => x => y > x ? x : mod (y) (x - y) const gcd = (x,y) => y === 0 ? x : gcd(y, mod (y) (x)) const rat = (n,d) => (g => cons(n/g, d/g)) (gcd(n,d)) const numer = head const denom = tail const ratAdd = (x,y) => rat(numer(x) * denom(y) + numer(y) * denom(x), denom(x) * denom(y)) const rat2str = r => `${numer(r)}/${denom(r)}` // example complex data let x = rat(1,2) let y = rat(1,4) console.log(rat2str(x)) // 1/2 console.log(rat2str(y)) // 1/4 console.log(rat2str(ratAdd(x,y))) // 3/4