【发布时间】:2009-05-11 10:32:49
【问题描述】:
我正在用解释器编写类似方案。似乎很自然,类 Scheme 解释器应该与任何实现 IEnumerable 的对象一起工作。
解释器不允许突变 - 没有暴露有副作用的函数。
因为 IEnumerable 不可克隆,(请参阅 here ),我无法使用 car 和 cdr 有效地实现对列表的迭代。
为了让任何“高阶”的东西变得高效,我不得不实现一些原语作为解释器的 C# 内置函数。
到目前为止,我已经将以下“原语”实现为 C# 内置函数:
- 过滤器
- 地图(完整地图,不仅仅是地图车)
- 文件夹
但我怀疑,例如,我可能会使用 map 和 foldr 的组合来实现“过滤器”。
我需要公开为“内置”的最小原语集是什么,这样我就可以在 IEnumerable 实例上实现任何其他功能,而无需额外的运行时间或空间成本,并且不必引入突变?
【问题讨论】:
-
只是一个观察。我曾经也将 IEnumerable 用于列表,但是一旦您需要不正确的列表,整个事情就会变得平淡无奇。我发现创建一个 Cons 类并像在 Scheme 中一样使用它会更好。这并不是说你的 Cons 不能是 IEnumerable,只是不要依赖它是一个正确的列表。
-
Enumerable 可以快速“克隆”。只需使用 select 并传入选择器的标识函数即可。
标签: c# functional-programming scheme