Questions tagged «functional-programming»

函数式编程是一种编程范例,主要使用函数作为构建抽象和表达包含计算机程序的计算的手段。

1
基于约束的代数数据类型推断
我正在研究一种基于表达的ML族谱语言,因此自然需要类型推断> :) 现在,我正在尝试基于EOPL(Friedman和Wand)中的简单实现,将基于约束的解决方案扩展到类型推断问题,但是它们优雅地避开了代数数据类型。 到目前为止,我的工作进展顺利;如果一个表达式e是a + b,e : Int,a : Int和b : Int。如果e是比赛, match n with | 0 -> 1 | n' -> n' * fac(n - 1)`, 我可以正确地推断t(e) = t(the whole match expression),t(n) = t(0) = t(n'),t(match) = t(1) = t(n' * fac(n - 1)等... 但是我不确定何时涉及代数数据类型。假设有一个类似filter的函数: let filter pred list …

1
ML类型推断的指数成本的简洁示例
引起我注意的是,像OCaml这样的功能语言中类型推断的成本可能很高。该主张是有一系列表达式,使得对于每个表达式,相应类型的长度在表达式的长度上是指数的。 我设计了以下顺序。我的问题是:您是否知道一个具有更简洁表达式的序列,可以实现相同的类型? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

4
证明功能代码正确的常见形式化技术有哪些?
我想为我作为论文一部分编写的Haskell程序的某些部分提供证明。但是到目前为止,我找不到很好的参考书。 格雷厄姆·赫顿(Graham Hutton)的入门书籍《编程在Haskell中编程》(《Google图书》)(我在学习Haskell时就读了)涉及一些推理程序的技巧,例如 方程式推理 使用非重叠模式 列表归纳 在第13章中,但不是很深入。 您是否可以推荐任何书籍或文章,以更详细地概述Haskell或其他功能代码的形式证明技术?

2
是否存在以纯数据流样式构成“增量更新”功能的范例?
我不知道问这个问题的正确术语,所以我会用很多单词来描述它,请耐心等待。 背景,正好在同一页上:程序通常包含缓存-时间/内存的权衡。程序员的一个常见错误是在更改其上游源/先例之一后忘记更新缓存的值。但是数据流或FRP编程范例可以避免此类错误。如果我们有许多纯函数,并在有向依存关系图中将它们连接在一起,则节点可以缓存并重用其输出值,直到任何函数的输入发生变化。该系统体系结构在《基于数据流的环境中的缓存》一文中进行了描述,并且使用命令式语言或多或少地类似于记忆。 问题:当函数的输入之一确实发生变化时,我们仍然必须整体执行该函数,丢弃其缓存的输出并从头开始重新计算。在许多情况下,这对我来说似乎是浪费。考虑一个简单的示例,该示例生成一个“前5名”列表。输入数据是任何内容的未排序列表。它作为输入传递给输出排序列表的函数。依次输入到仅接受前5个项目的功能。用伪代码: input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45] intermediate = sort(input) final_output = substring(intermediate, 0, 5) 排序函数的复杂度为O(N log N)。但是请考虑在应用程序中使用此流程,在该应用程序中,输入仅通过添加1个元素而仅稍有变化。与其每次都从头开始重新排序,不如使用O(N)函数,它通过在正确位置插入新元素来更新旧的缓存排序列表,将更快。这只是一个示例-许多“从头开始”功能都具有这种“增量更新”功能。另外,也许新添加的元素甚至不会出现在final_output中,因为它位于第5位之后。 我的直觉表明,有可能以某种方式将这样的“增量更新”功能与现有的“从头开始”功能并排添加到数据流系统中。当然,从头开始重新计算所有内容必须始终具有与进行一系列增量更新相同的结果。系统应具有这样的特性:如果每个单独的原始FromScratch增量对总是给出相同的结果,然后由他们建造的大型复合功能也应该会自动给出相同的结果。 问题:是否可能有一个系统/体系结构/范式/元算法既可以支持FromScratch函数也可以支持它们的增量对等函数,并为提高效率而合作并组成大量流程?如果没有,为什么?如果有人已经研究了该范式并发布了它,那么它被称为什么,我能否简要了解它的工作原理?

1
自类型是否会使归纳构造的微积分过时?
自我类型是构造微积分[1]的扩展,允许语言表达通过Scott编码编码的代数数据类型。Scott编码提供了一种模式匹配功能O(1),这是在CC中包含归纳定义的主要动机之一。然而,“自我类型”却使基础理论变得更加简单和优雅,并且似乎同样强大。 从理论的角度来看,自我类型会否使CIC过时,或者在某些方面CIC相对于Self Tyes是有利的? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf


1
λ-演算:在函数的内存表示中最有效的是什么?
我想比较函数编码(Church / Scott)与传统编码(汇编器/ C)数据结构的性能。 但是在我这样做之前,我需要知道函数在内存中的表示效率。该功能当然可以部分应用(也称为闭包)。 我对当前流行的功能性语言(Haskell,ML)使用的编码算法以及可以实现的最有效的一种语言都感兴趣。 奖金点:有这样的编码该地图函数编码整数天然整数(short,int等,在C)。可能吗 我根据效率来评估效率。换句话说,编码越有效,对功能数据结构的计算性能的影响就越小。

2
在类型系统中证明分类操作
我想知道编程语言中的类型系统可以带来多大的好处。例如,我知道在依赖类型的编程语言中,我们可以创建一个Vector在类型签名中合并向量大小的类。这就像事实上的例子。我们还可以append使用这些签名编写函数,以便编译器证明结果列表的大小将是输入列表的总和。 例如,是否有一种方法可以对排序算法的类型签名进行编码,以便编译器保证结果列表是输入列表的排列?如果可能的话,如何做到这一点?

1
组合逻辑项是否总是更大?
因此,存在一种使用SK组合器将lambda微积分项转换为组合逻辑的算法。它产生的东西会爆炸。我想进一步了解这种规模的爆炸。我似乎无法想到更好的算法。我听说功能语言实际上已经编译为组合器,因此似乎必须存在更好的算法。我查阅了大卫·特纳(David Turner)关于该主题的论文,他基本上只是说要应用一些优化,并且它们会带来“显着的改进”。 “显着改善”是否意味着大小下降到仅多项式增长?是否有一种已知的方法可以将lambda项转换为仅增加(或更少)多项式的组合逻辑?如果存在这样的算法是否可行?

3
函数编程中的不变性真的存在吗?
尽管我在日常生活中是一名程序员,并且使用所有流行的语言(Python,Java,C等),但对于什么是函数式编程,我仍然不清楚。根据我的阅读,功能语言的一个特性是数据结构是不可变的。对我来说,这本身就引发了很多问题。但是首先,我会写一些我对不变性的理解,如果我错了,请随时纠正我。 我对不变性的理解: 程序启动时具有固定的数据结构和固定的数据 无法将新数据添加到这些结构 代码中没有变量 您只能从已经存在的数据或当前计算出的数据中“复制” 由于以上原因,不变性给程序增加了巨大的空间复杂性 我的问题: 如果数据结构应该保持不变(不可变),那么有人怎么在列表中添加新项目呢? 拥有无法获取新数据的程序有什么意义?假设您有一个连接到计算机的传感器,该传感器想将数据提供给程序。那是否意味着我们无法在任何地方存储传入的数据? 在这种情况下,函数式编程对机器学习有什么好处?由于机器学习是基于更新程序对事物的“感知”的假设而建立的,因此可以存储新数据。
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.