Questions tagged «functional-programming»

函数式编程是一种基于使用函数构建抽象,避免副作用和状态改变的编程范例。纯函数式编程是线程安全的。


13
python列表理解;压缩列表列表?
伙计们 我正在尝试找到问题的最优雅解决方案,并且想知道python是否为我想做的事情内置了任何东西。 我正在做的是这个。我有一个列表,A并且我有一个f接受项目并返回列表的函数。我可以使用列表推导来转换所有内容,A例如: [f(a) for a in A] 但这返回一个列表列表; [a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]] 我真正想要的是获取扁平化的列表; [b11,b12,b21,b22,b31,b32] 现在,其他语言也有它。传统上flatmap用函数式编程语言来称呼它,而.Net则称它为SelectMany。python有类似的东西吗?有没有一种巧妙的方法可以将函数映射到列表并展平结果? 我要解决的实际问题是:从目录列表开始,查找所有子目录。所以; import os dirs = ["c:\\usr", "c:\\temp"] subs = [os.listdir(d) for d in dirs] print subs currentliy给了我一个列表列表,但是我真的想要一个列表。

8
适用于初学者的Haskell或Standard ML?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 我将要教授离散结构的低年级课程。我之所以选择教科书“离散结构,逻辑和可计算性”,部分原因是它包含有助于使用功能性编程语言实现的示例和概念。(我也认为这是一本好教科书。) 我希望使用一种易于理解的FP语言来说明DS概念并供学生使用。大多数学生充其量只用Java进行一两个学期的编程。在查看了Scheme,Erlang,Haskell,Ocaml和SML之后,我选择了Haskell或Standard ML。由于以下原因,我倾向于Haskell,但我希望那些积极参与其中的程序员的意见。 Haskell和SML都具有模式匹配,这使得描述递归算法变得很困难。 Haskell具有很好的列表理解能力,与此类列表的数学表达方式非常匹配。 Haskell的评价很懒。非常适合使用列表理解技术构造无限列表。 SML具有真正的交互式解释器,可以在其中定义和使用功能。在Haskell中,必须先在单独的文件中定义函数并进行编译,然后才能在交互式shell中使用这些函数。 SML以易于理解的语法明确确认了函数参数和返回类型。例如:val foo = fn:int * int-> int。Haskell的隐式咖喱语法有点晦涩,但并非完全陌生。例如:foo :: Int-> Int-> Int。 Haskell默认情况下使用任意精度整数。它是SML / NJ中的外部库。SML / NJ默认将输出截断为70个字符。 Haskell的lambda语法很微妙-它使用单个反斜杠。SML更明确。不过,不确定是否在此类中是否需要lambda。 本质上,SML和Haskell大致等效。我倾向于Haskell,因为我喜欢Haskell中的列表理解和无限列表。但是我担心Haskell紧凑语法中的大量符号可能会引起学生问题。从我在SO上的其他文章中收集的信息来看,不建议Haskell开始使用FP。但是,我们不会尝试使用简单的算法来构建功能完善的应用程序。 你怎么看? 编辑:在阅读了您的一些好评后,我应该澄清一些要点。 在SML中,在解释器中定义函数与在外部文件中定义函数之间在语法上没有区别。假设您要编写阶乘函数。在Haskell中,您可以将此定义放入文件中并将其加载到GHCi中: fac 0 = 1 fac n = n * fac (n-1) 对我来说,这很清楚,简洁,并且与书中的数学定义相符。但是,如果要直接在GHCi中编写函数,则必须使用其他语法: let fac 0 = 1; fac …

4
这种混洗算法有什么问题(如果有的话),我怎么知道?
就像背景一样,我知道Fisher-Yates完美的随机播放。它的O(n)复杂度和保证的均匀性是一个很好的改组,如果在允许就地更新数组的环境中使用它,我真是个傻瓜(所以在大多数情况下,如果不是全部,命令式编程环境)。 遗憾的是,函数式编程世界无法让您访问可变状态。 但是,由于Fisher-Yates的缘故,我没有太多关于如何设计改组算法的文献。在解决这个问题的几个地方都做了简短的说明,然后才说“实际上是Fisher-Yates,这是您需要知道的所有内容”。最后,我必须提出自己的解决方案。 我想出的解决方案是这样的,它可以随机排列任何数据列表: 如果列表为空,则返回空集。 如果列表中有单个项目,则返回该单个项目。 如果列表非空,请使用随机数生成器对列表进行分区,然后将算法递归应用于每个分区,以组合结果。 在Erlang代码中,它看起来像这样: shuffle([]) -> []; shuffle([L]) -> [L]; shuffle(L) -> {Left, Right} = lists:partition(fun(_) -> random:uniform() < 0.5 end, L), shuffle(Left) ++ shuffle(Right). (如果对您来说,这看起来像是一种疯狂的快速排序,那么基本上就是这样。) 因此,这就是我的问题:使得费舍尔-耶茨(Fisher-Yates)很难找到改组算法的情况使寻找工具来分析改组算法同样困难。在分析PRNG的均匀性,周期性等方面,我可以找到很多文献,但是关于如何分析混洗的信息却很少。(实际上,我发现的有关分析混洗的一些信息完全是错误的,很容易通过简单的技术来欺骗。) 所以我的问题是:我该如何分析我的改组算法(假设random:uniform()调用是由生成具有良好特征的适当随机数的任务决定的)?我可以使用哪些数学工具来判断,例如,在1..100范围内的整数范围内的100,000次混洗运行是否给了我很好的混洗结果?我已经进行了一些测试(例如,将随机播放中的增量与减量进行比较),但是我想知道更多一些内容。 并且,如果对这种随机播放算法本身有任何见解,也将不胜感激。


2
如何在Rust中编写函数?
我正在尝试编写一个包含两个功能的功能。初始设计非常简单:一个函数需要两个函数并返回一个组合函数,然后我可以将其与其他函数组合起来,因为Rust没有休息参数。我碰到了令人沮丧的无助编译器错误。 我的撰写功能: fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a> where F: 'a + Fn(A) -> B + Sized, G: 'a + Fn(B) -> C + Sized, { Box::new(move |x| g(f(x))) } 我想如何使用它: fn main() { let addAndMultiply = compose(|x| x * …

10
FP和OO是否正交?
我一次又一次听到,我正在尝试理解和验证FP和OO是正交的。 首先,两个概念正交是什么意思? FP尽可能地鼓励不变性和纯净性,而OO似乎是为状态和突变而构建的–命令命令编程的组织性略微?我意识到对象可以是不可变的,但是OO似乎暗示着我的状态/变化。 他们似乎是相反的。这如何影响它们的正交性? 像Scala这样的语言可以轻松实现OO和FP,这是否会影响这两种方法的正交性?


3
同构函数的重要性
简短的问题:同构函数在编程中(即在函数编程中)的重要性是什么? 漫长的问题:我试图根据我不时听到的一些术语在功能编程和类别理论中的概念之间画出一些相似的地方。本质上,我试图将这些术语“解包”为具体内容,然后再进行扩展。这样,我就可以在了解我所谈论的到底是什么的情况下使用该术语。总是很好。 我一直听到的其中一个术语是同构,我认为这是关于功能或功能组成之间的对等的推理。我想知道是否有人可以提供一些常见的模式的见解,在这些模式中,同构的特性派上用场(在函数式编程中),以及获得的任何副产品,例如通过对同构函数进行推理而进行的编译器优化。

1
纯功能图和集的统计性能
给定一种数据结构规范,例如具有已知复杂性界限的纯功能图,则必须在几种实现方式之间进行选择。关于如何选择正确的树有一些民间传说,例如,红黑树通常被认为更快,但是AVL树在许多查找的工作负载下具有更好的性能。 是否有关于知识的系统性介绍(发表论文)(与布景/地图有关)?理想情况下,我希望看到在实际软件上执行的统计分析。例如,可能得出的结论是,有N种典型的地图用法,并列出每种地图的输入概率分布。 是否有系统的基准可以测试和设置不同输入分配的性能? 是否有使用自适应算法根据实际用法更改表示的实现?

8
带有回调的Python中的any()函数
Python标准库定义了一个any()函数 如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。 仅检查元素的取值为True。我希望它能够因此指定一个回调来告诉某个元素是否符合要求,例如: any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)

6
是否有可用于任何lambda的no-op(NOP)的方法参考?
这听起来像是一个奇怪的问题,但是有一种方法可以引用Java 8中Lambda的标准no-op(aka空操作,空模式方法,无操作,无操作方法)方法。 目前,我有一个方法,需要一个,void foo(Consumer<Object>)并且想要不执行任何操作,我必须声明: foo(new Consumer<Object>() { public void accept(Object o) { // do nothing } } 我希望能够执行以下操作: foo(Object::null) 代替。是否存在类似的东西? 不确定如何使用多参数方法-也许这是Java中lambda的缺陷。

11
Haskell函数是否可以通过正确性属性进行证明/模型检查/验证?
继续以下思想:是否存在可证明的现实世界语言? 我不认识你,但是我讨厌写我不能保证的代码。 在问完上述问题并得到了惊人的答复之后(谢谢!),我决定缩小对Haskell的可证明的,务实的方法的搜索范围。我选择Haskell是因为它实际上很有用(为此编写了许多 Web 框架,这似乎是一个不错的基准),而且我认为它在功能上非常严格,可能可以证明,或者至少允许测试不变式。 这就是我想要的(一直找不到) 我想要一个框架,可以查看以psudocode编写的Haskell函数: add(a, b): return a + b -并检查某些不变式是否保持在每个执行状态。我希望有一些正式的证明,但是我会选择模型检查器之类的东西。 在此示例中,不变的是给定值a和b,返回值始终是a + b之和。 这是一个简单的示例,但我认为这样的框架不可能存在。可以测试的函数的复杂度肯定会有一个上限(一个函数的10个字符串输入肯定会花费很长时间!),但这会鼓励更仔细地设计函数,与使用其他形式函数没什么不同方法。想象一下使用Z或B,当您定义变量/集时,您一定要确保为变量提供尽可能小的范围。如果您的INT永远不会超过100,请确保将其初始化!我认为,像这样的技术以及适当的问题分解应该能够令人满意地检查像Haskell这样的纯功能语言。 我对形式方法或Haskell还不是很有经验。让我知道我的想法是否合理,或者您认为haskell不适合?如果您建议使用其他语言,请确保其通过“具有网络框架”测试,并阅读原始问题:-)

11
知道lambda演算有多大帮助?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 对所有了解lambda演算的人:关于编程,它为您带来了什么好处?您会建议人们学习它吗?

15
您为什么决定使用Erlang来“反对”?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 您是否真的尝试过Erlang(编程的方式,而不仅仅是阅读其中的文章),并决定反对该项目?如果是这样,为什么?另外,如果您选择返回原来的语言,或者使用其他功能语言,例如F#,Haskell,Clojure,Scala或其他某种语言,那么这也很重要,并说明原因。

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.