问题标签 [purely-functional]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 一种避免常见使用 unsafePerformIO 的方法
我经常在 Haskell 代码中找到这种模式:
基本上,一个人有一个选项记录或类似的东西,最初是在程序开始时设置的。由于程序员比较懒惰,他不想options
在整个程序中携带记录。他定义了一个MVar
来保持它——通过一个丑陋的使用来定义unsafePerformIO
. 程序员确保状态只设置一次,并且在任何操作发生之前。现在程序的每个部分都必须unsafePerformIO
再次使用,只是为了提取选项。
在我看来,这样的变量被认为是务实的纯粹(不要打败我)。是否有一个库可以抽象出这个概念并确保变量只设置一次,即在初始化之前不进行任何调用并且不必编写unsafeFireZeMissilesAndMakeYourCodeUglyAnd
DisgustingBecauseOfThisLongFunctionName
data-structures - F# PurelyFunctionalDataStructures WeightBiasedLeftistHeap ex 3.4
我正在研究冈崎的纯功能数据结构并尝试构建 F# 实现。我也在完成书中列出的练习(有些非常具有挑战性)。好吧,我坚持练习 3.4,它要求修改 WeightBiasedLeftistHeap 的合并函数,使其在单遍中执行,而不是原来的 2 遍实现。
我还没有弄清楚如何做到这一点,并希望得到一些建议。SO上有另一篇文章,其中一个人通过几乎内联makeT函数在SML中做到这一点。我开始走这条路线(在评论的第 3.4 节第一次尝试中。但放弃了这种方法,因为我认为这真的不是一次执行(它仍然会'直到到达叶子然后展开并重建树)。我将其解释为仍然是两次合并是错误的吗?
这是我完整实现 WeightBiasedLeftistHeap 的链接。
这是我在 F# 中失败的尝试:
functional-programming - D中的函数类型
我对创建一个函数 Derivative 感兴趣,该函数返回一个函数,该函数是某个传递给它的某个函数的导数。但是,我希望能够对此进行专门化,以便对于特定功能,我可以返回分析解决方案。
所以,我正在寻找这样的东西:
但是,我目前以这种方式定义了 BSpline:
所以 BSpline 上的类型签名将是实函数(Real,Real),它与任何其他类型的函数都无法区分。解决这个问题的方法是创建一个定义了 opCall 的“BSpline”类吗?或者我可以做某种 typedef 来识别这个函数吗?
谢谢!
functional-programming - 功能命令式混合
纯函数式编程语言不允许可变数据,但某些计算以命令式方式更自然/直观地表达 - 或者算法的命令式版本可能更有效。我知道大多数函数式语言都不是纯粹的,并且允许您分配/重新分配变量并执行命令式的事情,但通常不鼓励这样做。
我的问题是,为什么不允许在局部变量中操作局部状态,而是要求函数只能访问它们自己的局部变量和全局常量(或者只是在外部范围中定义的常量)?这样,所有函数都保持引用透明性(它们总是在给定相同参数的情况下给出相同的返回值),但在函数内,计算可以用命令式术语表示(例如,while 循环)。
IO 等仍然可以通过正常的功能方式完成 - 通过单子或传递“世界”或“宇宙”令牌。
lisp - 将 Lisp 函数声明为“纯”的能力是否有益?
最近我读了很多关于Haskell的文章,以及它从纯粹的函数式语言中获得的好处。(我对讨论 Lisp 的 monad 不感兴趣)对我来说(至少在逻辑上)尽可能地隔离具有副作用的函数是有意义的。我已经setf
大量使用了其他破坏性函数,并且我认识到在 Lisp 和(大部分)其衍生产品中对它们的需求。
开始了:
- 类似的东西
(declare pure)
可能有助于优化编译器吗?或者这是一个有争议的问题,因为它已经知道了? - 该声明是否有助于证明一个函数或程序,或者至少是一个被声明为纯的子集?还是这又是不必要的,因为它对程序员、编译器和证明者来说已经很明显了?
- 如果没有别的,编译器对程序员使用此声明强制执行纯函数并增加 Lisp 程序的可读性/可维护性是否有用?
- 这有什么意义吗?还是我太累了,现在连想都不想?
我很感激这里的任何见解。欢迎提供有关编译器实现或可证明性的信息。
编辑
澄清一下,我并不打算将这个问题限制在 Common Lisp 上。它显然(我认为)不适用于某些衍生语言,但我也很好奇其他 Lisps 的某些功能是否倾向于支持(或不支持)这种设施。
scala - 学习 Haskell 以学习 Scala
我已经阅读了一些问题,例如 Scala vs Haskell 讨论两种语言的优点或学习哪种语言,但我已经知道我想学习 Scala。我是 uni 的 Java 程序员,现在主要使用 PHP。
我想学习 Scala,因为它看起来像是对个人项目的 Java 的改进,而且我还想学习一种函数式语言来提高我作为程序员的知识。
我想知道学习 Haskell 作为函数式编程的介绍是否是一个好主意,因为它纯粹是函数式的,所以我会正确地学习它,而不是在不知道为什么的情况下在 Scala 中随意使用一些函数式编程?
我也想将 Haskell 用于个人项目等,因为它看起来很棒,但我并没有真正看到它在现实世界中的许多应用,似乎更多地用于学术研究,因此想要学习它以获得功能理解然后继续到斯卡拉。
function - 为什么“纯”函数称为“纯”?
纯函数是没有副作用的函数——它不能做任何类型的 I/O,也不能修改任何东西的状态——而且它是引用透明的——当使用相同的输入多次调用时,它总是给出相同的输出。
为什么用“纯”这个词来描述具有这些属性的函数?谁首先以这种方式使用“纯”这个词,什么时候?有没有其他意思大致相同的词?
algorithm - 我怎样才能正确地遍历这个列表
以下示例是对问题的简化。我有一个清单[Either Foo Bar]
,还有另一个清单[Biz]
。这个想法是我从 的开头迭代每个Biz
元素,直到为空。结果将是现在 s 越来越多,越来越少[Either Foo Bar]
[Either Foo Bar]
Biz
Bar
Foo
[Either Foo Bar]
问题是能够在开始[Either Foo Bar]
使用[Biz]
.
如果有帮助,我可以发布一个我正在尝试做的事情的例子。
更新:好的,这是我正在使用的实际类型,仍然试图忽略我认为可能是无关信息的内容。如果我遗漏了重要的内容,请告诉我
[Either UnFlaggedDay CalendarDay]
[(CalFlag,Product, Day)]
我要做的Day
是Left
检查[Either UnFlaggedDay CalendarDay]
. 当我找到匹配项时,我想创建一个新列表,除了以下更改外UnFlaggedDay
完全相同: Product, Day)` 刚刚检查过。下面是我解决此问题的不同方法之间的一些损坏的代码。UnflaggedDay
CalendarDay
. At that point, I want to use the newly built list, that has the same number of elements still, and the
minus the
更新:
我制作了一些测试代码来解决我的想法。这是我到目前为止所拥有的
好的,这就是我卡住的地方。我需要能够将接下来的三个左值更改为右值。我的意图dummyFunc'
是在第一个Left
值处拆分列表,将其删除,添加新Right
值,加入先前拆分的列表,然后再重复两次。有没有更好的办法?如果没有,是否已经有一个函数可以根据我提到的标准将列表分成两半?我可以弄清楚如何手动完成,但我不想重新发明轮子。
tree - 本地编辑纯功能树
让我们定义一棵树 T:
假设一个新节点被添加到 E,产生 T':
在可变语言中,这是一项简单的任务——只需更新 E 的孩子,我们就完成了。然而,在一个不可变的世界中,首先必须知道通往 E 的路径,然后从 E + new child 导出 E',然后导出 B',最后导出 A'(= T')。
这很麻烦;理想情况下,将有一些函数会采用 E 和 G(可能还有 T)的值并产生 T',而不提供 E 的路径。
我看到了两种可能的方法来解决这个问题:
- 父引用 - 这样,每个节点都能够派生到根的路径。两个问题:创建两个相互引用的节点(即父 <-> 子)在纯函数式语言中是一个问题(任何简单的解决方案?);并且每当 E -> E' 被派生时, E' 的所有孩子也需要新派生,因为它们现在存储 E 的旧值而不是 E'。
- 拉链 - 每个节点在创建时存储一个拉链,从其父拉链派生。相互引用的问题消失了,但是当 E -> E' 被派生时,所有 E' 的孩子的拉链也需要被派生,因为它们现在指向旧树 E。
考虑到合理的表现,我的愿望是否可能实现?非常感谢您的任何意见!
haskell - 编辑纯函数图
假设有一个图表和一些函数集,例如:
我想创建不期望Graph
作为参数的那些函数的版本,主要是为了方便(最好没有单子,所以我不需要将每个图形操作代码块包装在单子块中)。那么这个呢:
或更一般地说:
然后我就可以像使用(Graph -> ...)
普通节点一样使用这些值。最后,要从一个值中得到一个真实的图形(Graph -> ...)
,只需将它应用于一个空图形。这是一个合理的方法吗?