【问题标题】:What's the minimal set of sequence "primitives" required for any sequence computations?任何序列计算所需的最小序列“原语”集是多少?
【发布时间】:2009-05-11 10:32:49
【问题描述】:

我正在用解释器编写类似方案。似乎很自然,类 Scheme 解释器应该与任何实现 IEnumerable 的对象一起工作。

解释器不允许突变 - 没有暴露有副作用的函数。

因为 IEnumerable 不可克隆,(请参阅 here ),我无法使用 car 和 cdr 有效地实现对列表的迭代。

为了让任何“高阶”的东西变得高效,我不得不实现一些原语作为解释器的 C# 内置函数。

到目前为止,我已经将以下“原语”实现为 C# 内置函数:

  1. 过滤器
  2. 地图(完整地图,不仅仅是地图车)
  3. 文件夹

但我怀疑,例如,我可能会使用 map 和 foldr 的组合来实现“过滤器”。

我需要公开为“内置”的最小原语集是什么,这样我就可以在 IEnumerable 实例上实现任何其他功能,而无需额外的运行时间或空间成本,并且不必引入突变?

【问题讨论】:

  • 只是一个观察。我曾经也将 IEnumerable 用于列表,但是一旦您需要不正确的列表,整个事情就会变得平淡无奇。我发现创建一个 Cons 类并像在 Scheme 中一样使用它会更好。这并不是说你的 Cons 不能是 IEnumerable,只是不要依赖它是一个正确的列表。
  • Enumerable 可以快速“克隆”。只需使用 select 并传入选择器的标识函数即可。

标签: c# functional-programming scheme


【解决方案1】:

System.Linq 命名空间中的所有函数都已为您准备好了。

  1. 过滤器 = 哪里
  2. 地图 = 选择
  3. fold/reduce = 聚合(foldr = 反向然后聚合)

你会发现更多。例如

SelectMany = 地图 + 地图 + 展平 GroupBy = 分区

remq 和朋友可以在过滤器方面做。

更新

与普通的 Scheme 定义不同,这些显然只需要 1 个列表参数。

【讨论】:

  • 啊,但我不能在地图和折叠方面实现过滤器吗?...我想...需要一种构造 IEnumerables 的方法
  • 你可以,但为什么呢? :) 会很丑!
【解决方案2】:

您不必严格要求 map 是一个原语,因为您可以根据 foldr 来定义它。

示例(在 Haskell 中):

map f = foldr (\a b->f a:b) []

这真的是mapcar 不是map,但是完整的map 在Haskell 中很难表达,因为apply 不可用。

更完整的例子(在Scheme中):

(define (mapcar f l)
  (foldr (lambda (x t) (cons (f x) t)) ‛() l))

(define (heads ls) (mapcar car ls))

(define (tails ls) (mapcar cdr ls))

(define (any-null? ls) (foldr or? ﹟f (mapcar null? ls)))

(define (map f . ls)
  (if (any-null? ls)
      ‛()
      (cons (apply f (heads ls)) (apply map f (tails ls)))))

如果您没有carcdr,还有其他方法可以定义它们,例如如果您的语言中有闭包和变量:

(define (car a) (foldr (lambda (x y) x) ﹟f a))

(define (cdr a)
  (let ((prev ‛())
        (tmp #f))
    (foldr (lambda (h t) (set! tmp (cons h t)) (set! prev t) tmp)
           ‛()
           a)
    prev))

【讨论】:

    【解决方案3】:

    我不太确定您在序列计算中的目标是什么功能,但是 concat 操作(即展平嵌套序列)也可能非常有用。看看 Haskell 的列表推导是如何脱糖的,看看为什么。

    【讨论】:

    • 为了展平 嵌套 序列,.NET 有 SelectMany
    猜你喜欢
    • 2016-05-15
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2023-03-15
    • 2019-05-22
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多