Questions tagged «functional-programming»

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

1
可以使哪些类的数据结构持久化?
持久数据结构是不可变的数据结构。对它们的操作将返回数据结构的新“副本”,但会被操作更改;尽管旧的数据结构保持不变。通常,通过共享一些基础数据并避免完全复制数据结构来实现效率。 问题: 是否存在关于可以使数据结构类别持久化(同时保持相同或非常相似的复杂性)的结果? 是否可以使所有数据结构具有持久性(同时保持相同或非常相似的复杂性)? 是否已知任何数据结构无法持久化(同时保持相同或非常相似的复杂性)?

3
类型'a->'b的ML函数
我们的教授要求我们考虑OCaml中具有以下类型的函数 'a -> 'b 即,一个参数的函数可以是任何东西,并且可以返回不同的任何东西。 我想到了raise在忽略其参数的函数中使用: let f x = raise Exit 但是这位教授说,有一种解决方案不需要标准库中的任何功能。我很困惑:'b如果一开始就没有一个,怎么办? 我在这里而不是在Stack Overflow上问是因为我想了解发生了什么,我不想只看一个没有解释的程序。

3
如何使语言谐音
根据本文,以下Lisp代码行将“ Hello world”打印到标准输出。 (format t "hello, world") Lisp是一种谐音语言,可以通过以下方式将代码视为数据: 现在假设我们编写了以下宏: (defmacro backwards (expr) (reverse expr)) 向后是宏的名称,该宏采用一个表达式(表示为列表)并将其反转。再次使用宏,这是“您好,世界”: (backwards ("hello, world" t format)) 当Lisp编译器看到该行代码时,它将查看列表(backwards)中的第一个原子,并注意到它为宏命名。它将未评估的列表传递("hello, world" t format)给宏,该宏将列表重新排列为(format t "hello, world")。结果列表将替换宏表达式,并且将在运行时对其进行评估。Lisp环境将看到它的第一个原子(format)是一个函数,并对其进行评估,并将其余的参数传递给它。 在Lisp中,完成此任务很容易(如果我错了,请纠正我),因为代码是作为列表实现的(s-expressions?)。 现在看看这个OCaml(不是谐音语言)片段: let print () = let message = "Hello world" in print_endline message ;; 想象一下,您想向OCaml添加谐音,与Lisp相比,它使用的语法要复杂得多。你会怎么做?语言是否必须具有特别简单的语法才能实现谐音? 编辑:从该主题中,我找到了另一种实现同音的方法,该方法不同于Lisp的方法:用io语言实现的方法。它可能会部分回答这个问题。 在这里,让我们从一个简单的块开始: Io> plus := block(a, b, …

3
学习编程语言理论
最近,我对理解和证明(功能)编程语言的各个方面非常感兴趣。 但是,随着我的深入研究,如果没有适当的解释,演算,类别理论和指称语义之类的东西将有些难以理解。λλ\lambda 我读过SICP(相当有启发性的书),但我希望深入研究函数式编程理论。是否有书籍/博客/站点/您的名字可以从头开始讨论功能编程语言的理论?

1
没有多态Lambda演算的朴素集理论模型?
在菲利普·沃德勒(Philip Wadler)关于免费定理的论文中,他在关于参数性的第二节中指出 没有多态lambda演算的幼稚集理论模型 在朴素的集合理论模型中,类型是集合,函数是集合理论函数,这似乎是合理的。那么,为什么他说没有多态Lambda演算的幼稚集合论模型呢?

3
纯粹为功能编程设计的CPU有何不同?
在一定程度上,CPU在设计时会考虑人们会为它隐式或显式编写的软件。 在我看来,如果您看一下指令集体系结构的设计,就每个指令编码一个命令式样式命令的意义而言,它们是非常“必要的”。在我看来,当前的指令集架构在某种程度上是基于程序员产生的代码类型而发展的。 如果一个人从头开始设计CPU,并且知道它只会运行以功能编程风格编写的程序,那么该CPU的设计将与现有CPU有何不同?



2
高阶函数是否为函数式编程提供了更多功能?
我在cstheory.SE上问过类似的问题。 根据关于Stackoverflow的答案,有一种算法在非惰性纯函数式编程语言上具有复杂度,而在命令式编程中,同一算法是。向FP语言添加惰性可以使算法。Ω (n )Ω (n )Ω (ñ 日志n )Ω(nlog⁡n)\Omega(n \log n)Ω (n )Ω(n)\Omega(n)Ω (n )Ω(n)\Omega(n) 比较带有和不带有高阶函数的FP语言是否存在等效关系?它仍然是图灵完整的吗?如果是这样,那么FP缺少高阶语言是否会使该语言的“功能”或效率降低?

2
CPU体系结构是否偏向于程序运行时?
是否可以对CPU进行任何更改,以使它们在诸如Rust的并行运行时性能更好?例如,是否对分支预测实现或缓存大小进行了更改,以帮助并发运行时? 我的印象是,当前的CPU设计可能会针对诸如C之类的过程运行时进行更多优化。如果我们改为针对并发运行时进行优化,那么CPU看起来会有什么不同? 出于重要性,分支预测是基于分析过程代码的研究论文中得出的概括来实现的。我想知道并发抽象是否会给运行时添加一个重要的工作集,从而对现有分支预测算法产生不利影响。例如,在for循环中进行预测是一回事,但是当分支的目标始终是内存的某些新部分(图形,文本等)时,它将始终是缓存未命中,并且永远不会存在分支它的历史-因为还没有人碰过它。 这可能是一个愚蠢的问题,因为尽管内容可能始终位于RAM中,但其内容将被分支到比将要使用的数量级小(一旦被加载到缓存中)...但是仍然在过程运行时中,它应该是存储在缓存和分支预测变量中的上下文的可观察时间边界,这在更加并行化的环境中将表现为抽象边界。所以我想知道...是否遵守了这些界限?有研究论文对此进行分析吗? CPU体系结构是否偏向于过程代码而不是并发代码?还是现代的CPU具有足够的通用性而不会遭受高并发语言的困扰?

1
IO monad在技术上是否不正确?
在haskell Wiki上,有以下有条件使用IO monad的示例(请参见此处)。 when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) 请注意,在此示例中,对的定义IO a是RealWorld -> (a, RealWorld)为了使所有内容都易于理解。 该代码段有条件地在IO monad中执行一个动作。现在,假设condition是False,则action永远不应执行该操作。使用惰性语义确实是这种情况。然而,需要注意这里是Haskell是从技术上来说不严格。这意味着,例如,允许编译器抢先action world在其他线程上运行,然后在发现不需要时放弃该计算。但是,到那时,副作用已经发生了。 现在,可以以这样一种方式来实现IO monad,即仅在整个程序完成时才传播副作用,并且我们确切知道应该执行哪些副作用。但是,事实并非如此,因为有可能在Haskell中编写无限的程序,而这些程序显然具有中间的副作用。 这是否表示IO monad在技术上是错误的,还是有其他阻止此情况发生的方法?

3
“森林砍伐”如何从程序中删除“树”?
我想了解森林砍伐如何消耗,并产生在同一时间列表(由折叠和展开功能- 看到代码审查这个很好的答案在这里),但是当我相比,随着对技术的维基百科条目也谈到了“删除程序中的树木。 我了解如何将程序解析为语法分析树(是吗?),但是对某种形式的程序进行简化(是吗?)时使用砍伐森林的含义是什么?我该如何对我的代码进行处理?


2
类似于数组的不可变(持久)数据结构实现,具有快速索引,追加,前置,迭代
我正在寻找类似于数组(但不可变)的持久性数据结构,以允许快速索引,追加,前置和迭代(良好的局部性)操作。 Clojure提供了持久的Vector,但仅用于快速追加。Scala的Vector具有有效的固定时间追加和前置,但我无法实现,因为它基于与Clojure向量相同的数据结构(位映射向量trie),并且据我所知,位映射向量trie没有一些技巧就无法快速上手。 我对不是准备使用实现感兴趣,而对自己如何实现这种数据结构的描述感兴趣。

1
“ CPS”方法严重损害了SML / NJ的性能;所需的推理
在对学习F# 的评论中:使用其他编程语言的哪些书籍可以翻译为F#以学习功能概念?Makarius说: 请注意,“ CPS”方法对SML / NJ中的性能造成了很大的损害。它的物理评估模型违反了硬件中内置的太多假设。如果您采用Isabelle / HOL之类的SML大型符号应用程序,则带有CPS的SML / NJ大约会问世。比传统堆栈的Poly / ML慢100倍。 有人可以解释原因吗?(最好有一些示例)这里是否存在阻抗不匹配?

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.