functional-programming相关内容

什么是“Lambda 提升"?

我刚刚在浏览 Erlang 编译器源代码时遇到了这个问题. 我不太明白.(去图;)),考虑到我刚刚意识到 5 分钟前有这样的事情). 请原谅我在没有首先尝试了解其存在原因的情况下先询问. 有一篇关于它的维基百科文章,但它非常神秘. 解决方案 Lambda 提升用于将闭包转换为纯函数.通过向函数传递额外的参数,您可以减少其自由变量的数量.当您将 lambda “提升"到越来 ..
发布时间:2022-01-02 13:56:14 其他开发

纯函数式编程上下文中的面向对象编程?

在函数式编程 (FP) 上下文中使用面向对象编程 (OOP) 有什么优势吗? 我已经使用 F# 有一段时间了,我注意到我的函数越是无状态,我就越不需要将它们作为对象的方法.特别是,依靠类型推断使其在尽可能多的情况下可用是有好处的. 这并不排除需要某种形式的命名空间,这与 OOP 是正交的.也不鼓励使用数据结构.事实上,真正使用 FP 语言很大程度上依赖于数据结构.如果您查看在 F Sh ..
发布时间:2022-01-02 13:56:03 其他开发

UML 可以用于建模函数式程序吗?

更具体地说,您如何使用图表而不是文本表示对功能程序或使用功能样式(没有类)开发的程序进行建模. 解决方案 函数式程序员通常不太会使用图表.许多函数式程序员(但不是全部)发现写下类型是封装面向对象程序员放入 UML 图中的设计关系的好方法. 因为可变状态在函数式程序中很少见,所以没有可变的“对象",所以通常不需要或不需要绘制它们之间的关系图.虽然一个函数可能会调用另一个函数,但这个属性 ..
发布时间:2022-01-02 13:55:43 其他开发

为什么 Haskell 代数数据类型是“封闭的"?

如果我错了,请纠正我,但 Haskell 中的代数数据类型似乎在许多情况下很有用,您将在 OO 语言中使用类和继承.但是有一个很大的区别:代数数据类型一旦声明,就不能扩展到其他地方.它是“封闭的".在 OO 中,您可以扩展已经定义的类.例如: data 也许 a = 无 |只是一个 我无法在不修改此声明的情况下稍后以某种方式向此类型添加另一个选项.那么这个系统有什么好处呢?面向对象的方式似乎更 ..
发布时间:2022-01-02 13:55:36 其他开发

“免费积分"的优缺点是什么?函数式编程的风格?

我知道在某些语言(Haskell?)中,努力是实现无点风格,或者从不通过名称显式引用函数参数.这对我来说是一个很难掌握的概念,但它可能有助于我理解这种风格的优点(甚至可能是缺点)是什么.谁能解释一下? 解决方案 我相信目的是要简洁,并将流水线计算表达为函数的组合,而不是考虑通过线程参数.简单示例(在 F# 中) - 给出: let sum = List.sum让 sqr = List.m ..
发布时间:2022-01-02 13:55:27 其他开发

非编程术语中的 Monad

可能的重复: 什么是单子? 您如何用非编程术语来描述 monad?是否有一些编程之外的概念/事物(所有编程之外,而不仅仅是 FP)可以说是在一种重要的方式中起作用或类似于 monad? 解决方案 这是我目前的尝试: Monads 是桶旅: 每次操作都是一个人排队;即,操作发生的顺序是明确的. 每个人将一个桶作为输入,从中取出东西,然后将新东西放入桶中.桶又被传递给旅中 ..
发布时间:2022-01-02 13:55:17 其他开发

函数式编程范式是否有可视化建模语言或风格?

UML 是一种针对软件建模的标准,该软件将以面向对象的语言编写,并与 Java 齐头并进.尽管如此,它是否可能用于对打算以函数式编程范式编写的软件进行建模?考虑到嵌入的视觉元素,哪些图表会变得有用? 是否有一种针对函数式编程的建模语言,更具体地说是 Haskell?您会推荐哪些用于组合图表的工具? 由 OP 于 2009 年 9 月 2 日编辑: 我正在寻找的是代码中发生的事情的 ..

FP 和 OO 是正交的吗?

我一次又一次地听到这种说法,我试图理解和验证 FP 和 OO 是正交的想法. 首先,两个概念正交是什么意思? FP 尽可能地鼓励不变性和纯度,而 OO 似乎是为状态和突变而构建的——命令式编程的一个稍微有组织的版本?我意识到对象可以是不可变的,但 OO 似乎对我暗示了状态/变化. 他们似乎是对立的.这如何影响它们的正交性? 像Scala这样的语言让OO和FP都可以轻松搞定, ..

什么是依赖类型?

有人可以向我解释依赖打字吗?我对 Haskell、Cayenne、Epigram 或其他函数式语言的经验很少,因此您使用的术语越简单,我就越感激! 解决方案 考虑一下:在所有体面的编程语言中,您都可以编写函数,例如 def f(arg) = 结果 这里,f 接受一个值 arg 并计算一个值 result.它是一个从值到值的函数. 现在,某些语言允许您定义多态(又名泛型)值: d ..
发布时间:2022-01-02 13:54:50 其他开发

单子 vs. 箭头

我对monads 和箭头 用于函数式编程.我也明白它们可以用来解决类似的问题. 但是,对于在任何特定情况下如何选择使用哪个,我仍然有些困惑. 什么时候应该使用monad,什么时候应该使用箭头? 解决方案 Lindley, Wadler & 有两篇优秀论文Yallop(在 LTU 此处讨论). 要理解的最重要的事情是更多箭头的东西比单子的东西多.相反,monad 严格来说比 ..

函数式语言(特别是 Erlang)如何/为什么可以很好地扩展?

一段时间以来,我一直在关注函数式编程语言和功能日益增长的知名度.我调查了他们,没有看到上诉的原因. 然后,最近我在 Codemash 参加了 Kevin Smith 的“Erlang 基础"演讲. 我很喜欢这次演讲,并了解到函数式编程的许多特性使避免线程/并发问题变得更加容易.我理解缺乏状态和可变性使得多个线程无法更改相同的数据,但是 Kevin 说(如果我理解正确的话)所有通信都是通 ..

Scala 中 foldLeft 和 reduceLeft 的区别

我已经了解了 foldLeft 和 reduceLeft 之间的基本区别 左折叠: 必须传递初始值 reduceLeft: 将集合的第一个元素作为初始值 如果集合为空则抛出异常 还有其他区别吗? 有两种功能相似的方法有什么具体原因吗? 解决方案 在给出实际答案之前,这里有几点需要提及: 你的问题与left没有任何关系,而是关于reduce和fold ..

函数式编程语言和命令式编程语言有什么区别?

大多数主流语言,包括面向对象的编程 (OOP) 语言,例如 C#、Visual Basic、C++ 和 Java,旨在主要支持命令式(过程)编程,而 Haskell/gofer 之类的语言则是纯函数式的.任何人都可以详细说明这两种编程方式之间的区别是什么? 我知道选择编程方式取决于用户的需求,但为什么建议学习函数式编程语言? 解决方案 定义:命令式语言使用一系列语句来确定如何达到某个 ..
发布时间:2022-01-02 13:54:03 其他开发

什么是“举"?在斯卡拉?

有时当我阅读 Scala 生态系统中的文章时,我会读到“提升"/“提升"这个词.不幸的是,没有解释这究竟意味着什么.我做了一些研究,似乎提升与功能价值或类似的东西有关,但我无法找到以初学者友好的方式解释提升实际上是什么的文本. Lift 框架存在额外的混淆,该框架的名称有提升,但它没有t 帮助回答问题. Scala 中的“提升"是什么? 解决方案 有几个用法: 偏函数 ..
发布时间:2022-01-02 13:53:56 其他开发

“代数"是什么意思在编程的上下文中是什么意思?

我在函数式编程和 PLT 圈子中多次听说过“代数"这个词,尤其是在讨论对象、共子、透镜等时.谷歌搜索这个术语给出了对这些结构进行数学描述的页面,这对我来说几乎是不可理解的.谁能解释一下余代数在编程上下文中的含义,它们的意义是什么,以及它们与对象和共子的关系? 解决方案 代数 我认为首先要了解代数的概念.这只是对群、环、幺半群等代数结构的概括.大多数时候,这些东西都是以集合的形式介绍的 ..

通过 underscore.js 中的另一个数组过滤 json 数据

我有一个搜索字段,我想使用 underscore.js 添加一些复杂的功能. 有时用户搜索整个“句子"比如“Samsung Galaxy A20s ultra".我想使用搜索字符串中的任何单词过滤 JSON 数据,并按包含更多单词的结果进行排序. 示例数据: varphones = [{名称:“三星 A10s",ID:845},{名称:“三星星系",ID:839},{名称:“诺基亚 ..
发布时间:2022-01-02 13:53:40 其他开发

Netwire 5 中的 Kleisli Arrow?

我正在尝试使用 Haskell + Netwire 5 (+ SDL) 创建游戏.现在我正在处理输出部分,我想创建在某些游戏状态下读取的连线,并输出要在屏幕上进行 blitted 的 SDL 表面. 然而,问题在于 SDL 表面包含在 IO monad 中,因此任何创建此类表面的函数都必须具有类型 a ->IO b.当然,arr 不会从 a -> 构造一个 Wirem b.然而,由于线路的类 ..
发布时间:2022-01-02 13:53:25 其他开发

在 PAIP 中了解 Peter Norvig 的置换解决方案

Peter Norvig 的 PAIP 书籍包含此代码作为置换问题的解决方案(为简洁起见,删除了某些部分) (defun 排列(包);;如果输入为零,则只有一种排列:;;零本身(如果(空包)'(());;否则,从包中取出一个元素 e.;;生成剩余元素的所有排列,;;并将 e 添加到每个的前面.;;对所有可能的 e 执行此操作以生成所有排列.(mapcan #'(lambda (e)(mapcar ..

将 Swift 序列转换为相邻对

鉴于我在 Swift 中有一个数组,例如 [1,2,3,4],方法 pairs() 会将其转换为数组元组:[(1,2), (2,3), (3,4)]. 以下是 pairs() 应该如何表现的更多示例: pairs([]) 应该返回 [] 因为它没有对. pairs([1]) 也应该返回 [],因为它没有对. pairs([1,2]) 应该是 [(1,2)].它只有一对. 我可 ..
发布时间:2022-01-02 13:53:07 移动开发

如何从数学角度看待高阶函数和 IO 动作?

我试图从第一原则来理解函数式编程,但我仍然停留在纯函数世界和具有状态和副作用的不纯现实世界之间的接口上.从数学的角度来看, 什么是返回函数的函数? 什么是返回 IO 操作的函数(如 Haskell 的 IO 类型)? 详细说明:在我的理解中,纯函数是从域到共域的映射.最终,它是从计算机内存中的某些值到内存中的某些其他值的映射.在函数式语言中,函数是声明式定义的;即,它们描述了映射,但 ..