我们如何将这个Scheme (Lisp)函数转换为C#

问题描述 投票:0回答:1

在“计算机语言的结构和解释”中,作者向您展示了如何使用

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>

但是,我不相信其中任何一个都是正确的,即使它们是正确的,我也没有设法编写一个可以编译的方法。

有谁可以指点一下吗?

c# scheme lisp
1个回答
0
投票

静态类型使这稍微有点尴尬,但你可以非常直接地翻译该方案:

Func<int, int, Func<Func<int, int, int>, int>> cons = (int x, int y) => (Func<int, int, int> f) => f(x, y);
© www.soinside.com 2019 - 2024. All rights reserved.