在“计算机语言的结构和解释”中,作者向您展示了如何使用
cons
在 Lisp 中形成整数对(连接两个值),使用 car
提取第一个值,依此类推,所以开始通往数据结构的路径。
然后他们继续向您展示如何将一对整数封装在一个函数中,并继续以这种方式重写
cons
和 car
...
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
( z (lambda (p q) p)))
我花了一些时间来理解这两个整数,但如果我猜对了,新版本的
cons
返回一个封装这两个整数的函数,并允许您传入另一个函数来对它们执行某些操作。在重写 car
的情况下,第二个函数仅返回第一个整数。
作为一名 C# 程序员,我想知道是否可以在 C# 中做类似的事情。并不是说我能看到它有多少实际用途,但更重要的是这似乎是一个有趣的挑战。
但是,我似乎找不到在 C# 中定义
Cons(int x, int y)
方法来实现与 SICP cons
重写相同的方法。每当我认为我已经弄清楚它需要返回什么时,我就会决定我错了。
据我所知,
m
中的lambda中的cons
是一个作用于整数对的函数,大概会返回另一个整数。这意味着我的 C# Cons
的返回类型应该是 Func<int, int, int>
。然而,转念一想,它看起来应该返回一个函数,该函数接受两个整数的函数并返回另一个整数,这意味着它应该是Func<Func<int, int>, int>
。
但是,我不相信其中任何一个都是正确的,即使它们是正确的,我也没有设法编写一个可以编译的方法。
有谁可以指点一下吗?
静态类型使这稍微有点尴尬,但你可以非常直接地翻译该方案:
Func<int, int, Func<Func<int, int, int>, int>> cons = (int x, int y) => (Func<int, int, int> f) => f(x, y);