代码之家  ›  专栏  ›  技术社区  ›  Paul Hollingsworth

任何序列计算所需的最小序列“原语”集合是什么?

  •  2
  • Paul Hollingsworth  · 技术社区  · 16 年前

    我正在写一个类似于解释器的方案。类似于Scheme的解释器应该能够很好地处理任何实现IEnumerable的对象,这似乎很自然。

    因为IEnumerable是不可克隆的(参见 here

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

    1. 滤器
    2. 地图(完整地图,而不仅仅是地图车)
    3. 福尔德

    例如,我可以使用“但是我怀疑”和“但是我怀疑”的组合。

    3 回复  |  直到 8 年前
        1
  •  2
  •   leppie    16 年前

    所有函数都已在System.Linq命名空间中。

    1. 过滤器=其中
    2. map=选择
    3. 折叠/减少=聚合(折叠=反向,然后聚合)

    选择多个=贴图+贴图+展平 GroupBy=分区

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

    与正常的方案定义不同,这些方案显然只接受一个列表参数。

        2
  •  2
  •   finnw    12 年前

    你根本不需要 map 作为一个基本元素,你可以用 foldr .

    示例(在Haskell中):

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

    这真是 mapcar 地图 地图 很难用Haskell表达为 apply 没有。

    (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)))))
    

    如果你没有 car cdr

    (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
  •  0
  •   Ganesh Sittampalam    16 年前

    我不太确定序列计算的目标功能是什么,但concat操作(即展平嵌套序列)也可能非常有用。看看Haskell的列表理解是如何被去除的,看看为什么。