功能编程中的差异列表


14

问题自Okasaki以来,纯功能数据结构有何新变化?和jbapple的史诗答案,提到了在函数编程中使用差异列表(与逻辑编程相对),这是我最近感兴趣的事情。这使我找到了Haskell 的差异列表实现。我有两个问题(如果我应该在StackExchange上给他们两个不同的问题,请原谅/纠正我)。

一个简单的问题是,除了Haskell库中的代码之外,还有人意识到函数式编程和/或实现中的差异列表的学术考虑吗?jbapple的答案没有引用差异列表(逻辑编程中的差异列表存在于绝大部分内容中,并且存在于我在“周围某处”(TM)中提供的两个资源中)。在找到Haskell实现之前,我不知道这个想法已经从逻辑跃升为函数式编程。当然,Haskell差异列表是高阶函数的自然使用,其工作原理与逻辑编程中的完全不同,但是接口肯定是相似的。

我想问的更有趣(而且更模糊)的问题是上述Haskell差异列表库所要求的渐近上限看起来是否正确/合理。我的困惑可能是因为我失去了一些东西约显而易见约懒惰复杂的推理,但所主张的界限才有意义,我如果替换在大数据结构(或关闭阵型,或者变量查找,或东西)总是恒定的时间。还是“捕获”仅仅是因为“头”和“尾”的运行时间没有限制,正是因为这些操作可能必须经过任意一堆延迟的计算/替换才能完成?


1
起初,我对“函数式编程语言(与函数式编程语言相反)”感到困惑,但是您的意思是写“(与逻辑编程语言相对)”吗?
伊藤刚(Tsuyoshi Ito)2010年

哦,糟糕-是的,这就是我的意思,现在已修复。
罗伯·西蒙斯

在我看来,第二个问题在Stack Overflow上似乎更合适,但是,既然您已经在此处提出了问题,那么最好等待一下是否有人可以在这里回答。我个人无法通过阅读源代码找到任何理由来质疑所要求的范围,但是我没有遵循您的理由来质疑它们,而且我可能会遗漏一些东西。
伊藤刚(Tsuyoshi Ito)2010年

Answers:


9

还是“捕获”仅仅是因为“头”和“尾”的运行时间没有限制,正是因为这些操作可能必须经过任意一堆延迟的计算/替换才能完成?

Θ(m)m

O(1) fromList

{-# LANGUAGE NoMonomorphismRestriction #-}

data DL a = Id
          | Cons a
          | Compose (DL a) (DL a)

fromList [] = Id
fromList (x:xs) = Compose (Cons x) (fromList xs)

toList x = help x []
    where help Id r = r
          help (Cons a) r = a:r
          help (Compose f g) r = help f $ help g r

empty = Id

singleton = Cons

cons x = append (singleton x)

append = Compose

snoc xs x = append xs (singleton x)

Θ(n)headtail[a] -> [a]toList


因此,您从懒惰中得到的只是两次请求列表的尾部不会两次执行昂贵的操作,这很好。
罗伯·西蒙斯

@Rob,我不明白你的意思。
jbapple

我认为我试图(很糟)提出的观点已通过以下示例得以说明:我有一个非常长的差异列表“ xs”,通过反复将其“塞入”原始列表中而得出。我第一次将其称为“ head xs”,我希望这将花费O(n)的时间来进行延迟计算。但是,由于应该记住该计算,因此第二次调用“ head xs”(对于相同的 “ xs”)应花费O(1)时间。
罗伯·西蒙斯

1
好吧,我同意这一点,但是我在答案中所引用的惰性是关于fromList,它不用于snoc或head中。因此,就目前而言,它是一个令人讨厌的事情,我对您的陈述“从懒惰中得到什么”的“什么”感到困惑。我想说你的榜样和我的是你从懒惰中得到的件事。
jbapple

好的-这些澄清也有助于我更好地理解您的早期观点。
罗伯·西蒙斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.