Questions tagged «functional-programming»

6
自Okasaki以来,纯功能数据结构有何新变化?
自克里斯·冈崎(Chris Okasaki)1998年出版《纯功能数据结构》一书以来,我还没有看到太多新的令人兴奋的纯功能数据结构。我仅举几例: IntMap(也是由Okasaki于1998年发明,但未在该书中出现) 手指树(及其对monoid的泛化) 还有一些有趣的方法来实现已知的数据结构,例如使用“嵌套类型”或“广义代数数据类型”以确保树不变。 自1998年以来,在该领域又出现了哪些其他新想法?

2
纯功能数据结构中有哪些尚待解决的问题?
自1998年冈崎(Okasaki)的书出版以来,有关PFDS的新问题又激发了这个问题。 我将从两个问题开始: 是否有一种纯粹的功能集数据结构可以接近哈希表的速度?尝试还不存在。 是否有O(1)附加的纯功能手指树?迄今为止最好的是由Kaplan和Tarjan设计的O(lg lg n)。 还有哪些其他纯粹的功能数据结构问题?

2
用分类术语解释应用函子-单向函子
我想Applicative从范畴论的角度理解。 该文档的Applicative说,这是一个强烈的宽松monoidal仿函数。 首先,维基百科有关单调子函子的页面说,单调子函子要么松懈要么强大。因此在我看来,其中一个来源是错误的,或者它们使用的术语不同。有人可以解释吗? 其次,哪些Applicative是单曲面函子的单曲面类别?我假设函子是标准Haskell类别(对象=类型,态射=功能)上的内函子,但我不知道该类别上的单曲面结构是什么。 感谢帮助。

8
高阶算法
从它们的输入和输出是“普通”数据的意义上讲,大多数众所周知的算法都是一阶的。有些是简单的二阶方法,例如排序,哈希表或map和fold函数:它们是通过函数进行参数化的,但是除了在其他输入数据上调用它外,它们实际上并没有做任何有趣的事情。 有些也是二阶的,但更有趣: 由monoids参数化的手指树 在单调谓词上分裂手指树 前缀和算法,通常又用一个monoid或谓词等参数化。 最后,在我最感兴趣的意义上,有些是“真正的”高阶: Y组合器 差异清单 是否存在其他非平凡的高阶算法? 为了澄清我的问题,在“非平凡的高阶”下,我的意思是“在算法的接口和/或实现中以关键的方式使用计算形式主义的高阶设施”

1
具有规范功能的编程语言
是否有所有功能都具有规范形式的(功能?)编程语言?也就是说,为所有输入集返回相同值的任何两个函数都以相同的方式表示,例如,如果f(x)返回x + 1,而g(x)返回x + 2,则f(f(x ))和g(x)在编译程序时将生成无法区分的可执行文件。 也许更重要的是,我在哪里/如何找到有关程序规范表示的更多信息(谷歌搜索“规范表示程序”效果不佳)?这似乎是一个很自然的问题,而且恐怕我只是不知道我要寻找的正确术语。我很好奇这种语言是否有可能成为图灵​​完整的语言,如果不能,那么在保持这种属性的同时,您可以拥有多么丰富的编程语言。 我的背景非常有限,因此我希望先决条件较少的资源,但是对更高级资源的引用也可能很酷,因为这样我就知道我要努力争取什么。

2
Lambda演算和组合逻辑是否相同?
我目前正在阅读Hindley和Seldin撰写的“ Lambda微积分和组合器 ”。我不是专家,但是由于参与函数式编程(从Lisp和SICP​​开始,现在到R和Haskell),所以一直对lambda微积分感兴趣。 在“ 二进制演算和组合逻辑”,约翰·特朗普说: CL可以看作是Lambda演算的子集...理论在很大程度上是相同的,在存在可扩展性规则的情况下变得等效。 在什么条件下,人们会使用组合逻辑而不是lambda微积分? 任何参考将不胜感激。

5
是否有用于纯功能编程语言的带注释的形式验证系统?
ACSL(Ansi C规范语言)是C代码的规范,带有特殊注释,可对C代码进行正式验证。 我没有研究它,但是我想ACSL验证器中使用的形式方法将类似于Hoare Logic。但是对于纯函数式语言(例如Haskell),我无法想象将使用哪种形式主义进行形式验证。 除了纯函数式语言外,有人做过类似于ACSL的东西吗?如果不是,是否有针对功能语言的规范标注样式形式验证的研究? 我知道有一种依赖类型,许多语言(Agda,Idris等)都支持这种类型,但是在Haskell中,不进行某种(不可读的)类型wizardry很难实现依赖类型。考虑到这一点,由于Haskell具有比Agda和Idris更好的库支持,我相信这样的功能形式验证系统可能会有用,但是我不知道是否对此进行了研究。

1
交集和并集类型的实际问题是什么?
我正在设计一种简单的静态类型的函数式编程语言,作为一种学习体验。 到目前为止,我已经实现的类型系统似乎可以(需要做一些额外的工作)合并交集和并集类型,例如,您可以: <Union String Integer> <Union Integer Foo> 上面两种类型的交集将是一个普通的 Integer 两种类型的联合是 <Union String Integer Foo> 当然,这是可能的事实并不一定意味着它是一个好的设计思想。特别是,我有点担心保持类型不相交和/或处理重叠的实现困难。 在类型系统中合并此类功能的利弊是什么?

2
分析垃圾收集的编程语言中指定的最坏情况数据结构的运行时间时,可以忽略GC的成本吗?
我只是意识到我一直以为我的问题的答案是“是”,但我没有充分的理由。我想象也许有一个垃圾收集器,可证明只引入了最坏情况的减速。有没有我可以引用的权威参考文献?就我而言,如果这些细节很重要,那么我将使用纯功能数据结构,并使用Standard ML。O (1 )O(1)O(1) 当应用于例如Java中指定的数据结构时,也许这个问题会更加相关?使用Java的算法/数据结构教科书中可能有一些相关的讨论?(我知道Sedgewick具有Java版本,但是我只能访问C版本。)

2
全部功能编程的局限性是什么?
整体功能编程的局限性是什么?它不是图灵完备的,但仍支持可能程序的很大一部分。是否有可以用图灵完备的语言而不是全部功能的语言编写的重要构造? 可以完全静态分析以全部功能语言编写的程序,而图灵完备语言的静态分析却受制于停顿问题,这是否正确?我的意思并不是说在总功能语言中可以静态确定一切,因为有些事情只能在运行时知道,但是我的意思是理论上可以对以理想的总功能编程语言编写的程序进行分析,以便所有理论上可以静态确定,也可以静态确定。还是在无法使静态分析完成的全部功能语言中仍然存在无法确定的问题?无论使用哪种语言编写,某些问题始终是无法确定的,但是我对继承给该语言的此类问题很感兴趣,

2
类别理论,计算复杂度和组合关系?
我一直在尝试阅读“ 函数算法设计的珍珠 ”,然后阅读“ 编程代数 ”,在递归(和多项式)定义的数据类型与组合对象之间有着明显的对应关系,它们具有相同的递归定义并随后处于领先地位如组合物种简介中所述(我读“ 物种,函子和类型,噢,我的天哪! ”)。 那么,对于第一个问题,是否有一种方法可以从幂级数中恢复生成(递归)方程?那是事后的想法。 我对初始代数和最终共代数的概念更感兴趣,因为它们是“定义数据结构的过程”。函数式编程中有一些实用规则,涉及组成,代数之间的映射乘积以及类似内容,例如本教程所述。在我看来,这可能是解决复杂性的非常有效的方法,例如,在这种情况下恢复Master定理看起来相当简单(我的意思是,您必须做相同的论点,因此在这种情况下收益不大),以及原始代数的独特变形,以及F多项式函子的A和FA之间的代数是同构的(我误会了吗?),这使我认为,这种方法在分析E的复杂度方面可以有很多好处。对数据结构的操作。 从实践的角度来看,看起来像融合规则(基本上是相互组合代数态,子代态和一般态的方式)是用于程序转换和重构的非常强大的优化技术。我认为对这些规则的充分利用可以产生最佳程序是正确的(没有不必要的中间数据结构或其他额外操作)。 我在这里上东西吗?从学习的角度来看,以这种方式看一下计算复杂性是否是受益者?我们可以拥有“漂亮的”初始代数的结构是否因某些问题而过于局限? 我主要是想寻找一种方法来根据搜索空间的结构以及“搜索空间”和“搜索算法”通过某些“不错的”对象(例如函子的初始代数和了解在查看更复杂的结构时尝试以这种方式查看内容是否有用。

4
命令性语言与功能性语言之间的区别是什么?
我正在阅读西蒙·佩顿·琼斯(Simon Peyton Jones)的《函数式编程语言的实现》,有一个说法让我有些惊讶(第39页): 与命令式语言相比,功能语言在很大程度上是彼此的语法变体,语义上的差异相对较小。 现在,它写于1987年,我对此主题的想法可能会受到当时不流行或不流行的现代编程语言的影响。但是,我发现这有点难以置信。例如,我认为所描述的Miranda编程语言(Haskell的较早版本)与严格的语言(如ML)相比,语义要多得多,而不是说C必须进行Pascal甚至C进行小规模的交谈(尽管我承认C ++对他的观点提供了一些验证:-)。 但是话又说回来,我是基于我的直觉理解。西蒙·佩顿·琼斯(Simon Peyton Jones)的说法是否正确,还是有争议的观点?

3
读者,作家单子
令CCC为CCC。设(×)(×)(\times)为的乘积双函子CCC。由于Cat是CCC,因此我们可以咖喱(×)(×)(\times): curry(×):C→(C⇒C)curry(×):C→(C⇒C)curry (\times) : C \rightarrow(C \Rightarrow C) curry(×)A=λB.A×Bcurry(×)A=λB.A×Bcurry (\times) A = \lambda B. A \times B 函子范畴C⇒CC⇒CC \Rightarrow C具有通常monoidal结构。 所述的半群C⇒CC⇒CC \Rightarrow C处于单子CCC。 我们将有限积视为上的单调结构CCC。 curry(×)1≅idcurry(×)1≅idcurry (\times) 1 \cong id ∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)\forall A\ B. curry (\times) (A\times B) \cong (curry (\times) A) \circ (curry (\times) B) 因此(curry(×))(curry(×))(curry (\times))保留了单曲面结构,因此将一个单面体传输到单子,而将共形子传输到共体。即,它将一个任意的等分面词传输www到(Writer w)(Writer w)(Writer\ …

3
自举手指树结构
在使用2-3个手指树工作了相当多的时间后,我对它们在大多数操作中的速度印象深刻。但是,我遇到的一个问题是与大型手指树的初始创建相关的大量开销。因为构建被定义为一系列串联操作,所以最终构建了大量不需要的手指树结构。 由于2-3个手指树的复杂性质,我看不到用于引导它们的直观方法,而且我所有的搜索都为空。所以问题是,您如何才能以最少的开销引导2-3根手指的树呢? 明确地说:给定已知长度的序列,可以用最少的操作生成的手指树表示。小号小号Sññn小号小号S 天真的方法是连续调用cons操作(在文献中为' '运算符)。然而,这将创造代表的所有切片不同手指的树结构为。◃◃\triangleleftññn小号小号S[ 1 .. 我][1 ..一世][1..i]

2
(如何)在没有图灵计算模型的情况下,我们能否发现/分析NP问题?
从纯粹的抽象数学/计算推理观点来看,(如何)甚至可以发现或推理诸如3-SAT,子集和,旅行商等问题?从功能的角度来看,我们甚至能够以任何有意义的方式对它们进行推理吗?甚至有可能吗? 我一直在纯粹从自我询问的角度考虑这个问题,这是学习lambda微积分计算模型的一部分。我知道这是“非直觉的”,这就是Godel偏爱Turing模型的原因。但是,我只想知道这种计算功能样式的已知理论局限性是什么?对于分析NP类问题将有多少障碍?

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.