functional-programming相关内容

函数式编程:不可变的数据结构效率

我不明白,FP 编译器如何使处理不可变数据结构的代码快速,而不是炸毁堆栈等. 比如在树中插入操作,它在添加新节点之前必须复制整个树并返回复制的树,而命令式couterpart只需要添加一个指向新节点的指针.如果插入操作运行数百万次,将占用大量内存,并且当树更大时复制会越来越慢.FP 编译器实际上是如何优化这一点的? 解决方案 您不必复制整个树来进行更改;您可以共享大部分结构.见例如本 ..
发布时间:2022-01-02 13:59:47 其他开发

如何使用更高等级(rank-N)类型多态性来表达存在类型?

我们习惯于为多态函数使用通用量化的类型.存在量化类型的使用频率要低得多.我们如何使用通用类型量词来表达存在量化类型? 解决方案 事实证明,存在类型只是 Σ 类型(sigma 类型)的一个特例.它们是什么? Sigma 类型 正如 Π-types (pi types) 泛化我们的普通函数类型,允许结果类型依赖其参数的值,Σ-types 泛化对,允许第二个组件的类型依赖第一个值. ..

Swift 中泛型和 AnyObject 的区别

考虑这个 myFilter 函数,它接受一个通用参数并根据谓词过滤数组.这与 Swift 提供的 filter() 函数相同. func myFilter(source: [T], predicate:(T) -> Bool) ->[T] {var 结果 = [T]()因为我在源{如果谓词(i){结果.append(i)}}返回结果} 这与, 有什么不同 func myFilter(sou ..
发布时间:2022-01-02 13:59:27 移动开发

if-then 语句的功能替代是什么?

我一直在学习 F# 和函数式编程,并尝试以函数式的方式做事.然而,当谈到重写一些我已经用 C# 编写的代码时,我陷入了简单的 if-then 语句(那些只做某事,不返回值的语句).我知道你可以在 F# 中做到这一点: if expr then do () 但是,我认为这是一种命令式的编码方法吗?也许我对函数式编程的了解还不够多,但它对我来说似乎并不实用.我认为函数式方法是组合函数和表达式,而不 ..
发布时间:2022-01-02 13:59:17 其他开发

Scala集合函数

在斯坦福 Scala 课程中,我遇到了以下作业: 练习 1 – 设置为函数: 在本练习中,我们将把集合表示为从整数到布尔值的函数: type Set = Int =>布尔值 a) 编写一个函数“set",它接受一个 Int 参数并返回一个包含该 Int 的 Set. b) 编写一个“包含"函数,它接受一个 Set 和一个 Int 作为参数,如果 Int 在 Set 中则返回 ..
发布时间:2022-01-02 13:59:11 其他开发

函数式编程:状态与重新分配

我需要帮助弄清楚我当前的 OOP 状态概念与在 Haskell 或 Clojure 等函数式语言中实现的方式之间的差异. 举一个老生常谈的例子,假设我们正在处理简化的银行账户对象/结构/任何东西.在 OOP 语言中,我有一些类持有对 BankAccount 的引用,该类将具有诸如利率之类的实例变量,以及诸如 setInterestRate() 之类的方法,它们更改对象的状态并且通常不返回任何 ..

折叠和减少的区别?

尝试学习 F#,但在尝试区分 折叠 和 减少.折叠似乎做了同样的事情,但需要一个额外的参数.这两个功能的存在是否有正当理由,或者它们是为了适应不同背景的人?(例如:C# 中的字符串和字符串) 这是从示例中复制的代码片段: 让 sumAList 列表 =List.reduce (fun acc elem -> acc + elem) 列表让 sumAFoldingList 列表 =List. ..
发布时间:2022-01-02 13:58:53 其他开发

Haskell 中的高效字符串实现

我目前正在自学 Haskell,我想知道在 Haskell 中处理字符串的最佳实践是什么. Haskell 中默认的字符串实现是一个 Char 列表.根据 Real World Haskell,因为每个字符都是单独分配的(我认为这意味着 String 基本上是 Haskell 中的链表,但我不确定.) 但是如果默认的字符串实现对于文件 i/o 是低效的,那么在内存中处理字符串也是低效的 ..
发布时间:2022-01-02 13:58:42 其他开发

Monads 有什么特别之处?

monad 是一种数学结构,在(纯)函数式编程中大量使用,基本上是 Haskell.然而,还有许多其他数学结构可用,例如应用函子、强单子或幺半群.有些更具体,有些更通用.然而,单子更受欢迎.这是为什么? 我想出的一个解释是,它们介于通用性和特异性之间.这意味着 monad 捕获了足够多的关于数据的假设,以应用我们通常使用的算法,并且我们通常拥有的数据满足 monadic 定律. 另一种 ..
发布时间:2022-01-02 13:58:32 其他开发

Haskell 递归和内存使用

我对用递归替换循环的想法感到满意.我正在摆弄一个宠物项目,我想测试一些文本输入功能,所以我写了一个小命令行界面,它反复要求输入,直到它收到特定的退出命令. 看起来像这样: getCommandsFromUser = 做putStrLn "输入命令:"键盘输入 这完全按预期工作,但是来自 C/Java 背景,它仍然让我大脑深处、黑暗、无意识的部分发痒,让我想在荨麻疹中爆发,因为我无法动摇 ..
发布时间:2022-01-02 13:58:23 其他开发

为什么这个 Haskell 代码可以成功地处理无限列表?

我有一些 Haskell 代码确实可以在无限列表上正常工作,但我不明白 为什么它可以成功地做到这一点.(我修改了我的原始代码——它没有处理无限列表——从其他一些在线代码中合并一些东西,突然我发现它可以工作,但不知道为什么). myAny :: (a -> Bool) ->[a] ->布尔值myAny p list = foldr step False list在哪里步骤项目 acc = p 项目 ..
发布时间:2022-01-02 13:58:14 其他开发

为什么引发异常会产生副作用?

根据 副作用 的维基百科条目,引发异常构成副作用.考虑这个简单的 Python 函数: def foo(arg):如果不是 arg:raise ValueError('arg 不能为 None')别的:返回 10 使用 foo(None) 调用它总是会遇到异常.同样的输入,同样的输出.它是引用透明的.为什么这不是纯函数? 解决方案 只有当您观察到异常并根据异常做出改变控制流的决定时,才 ..
发布时间:2022-01-02 13:57:57 其他开发

纯函数:“无副作用"吗?暗示“总是相同的输出,给定相同的输入"?

定义一个函数为pure的两个条件如下: 无副作用(即只允许更改本地范围) 给定相同的输入,总是返回相同的输出 如果第一个条件总是成立,那么第二个条件是否也有不成立的时候? 即真的只有第一个条件才有必要吗? 解决方案 以下是一些不改变外部作用域但仍被视为不纯的反例: function a() { return Date.now();} function b() { ..

FRP - 事件流和信号 - 仅使用信号会丢失什么?

在最近的经典 FRP 实现中,例如reactive-banana,有事件流和信号,它们是阶梯函数(reactive-banana 称它们为行为,但它们仍然是阶梯函数).我注意到 Elm 只使用信号,并且不区分信号和事件流.此外,reactive-banana 允许从事件流到信号(已编辑:并且可以使用 reactimate' 对行为采取行动,尽管它不被认为是好的做法),这意味着理论上我们可以应用所有 ..
发布时间:2022-01-02 13:57:36 其他开发

带有回调的 Python 中的 any() 函数

Python 标准库定义了一个 any()函数 如果可迭代对象的任何元素为真,则返回 True.如果可迭代对象为空,则返回 False. 它只检查元素是否评估为 True.我希望它能够指定一个回调来判断一个元素是否符合要求,例如: any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0) 解决方案 怎么样: >>>an ..
发布时间:2022-01-02 13:57:28 Python

用于进度报告的惯用 clojure?

我应该如何监控 clojure 中映射函数的进度? 在使用命令式语言处理记录时,我经常每隔一段时间打印一条消息来表明事情已经走了多远,例如每 1000 条记录报告一次.本质上,这是计算循环重复次数. 我想知道在 clojure 中我可以采取哪些方法来将函数映射到我的记录序列上.在这种情况下,打印消息(甚至记录进度)似乎本质上是副作用. 到目前为止我想出的东西是这样的: (定义报 ..

什么时候应该使用 Kleisli?

我最近偶然发现了 Kleisli 的概念,我阅读的每个教程/链接/参考资料都通过以下结构激发了 Kleisli 的使用: 组合返回 monad 的函数:f: a ->m[b] 与 g: b ->m[c] - 我认为 monad 的 定义 已经捕捉到了这种情况 - do/bind/for/flatMap 做到了这一点.无需依靠 Kleisli 构造来实现这一目标.所以这不可能是 Kleisli ..
发布时间:2022-01-02 13:57:09 其他开发

函子和自函子的区别

有人能简单解释一下两者之间的区别吗?我没有完全理解 monad 是内函子而不是函子的部分. 解决方案 一个函子可以从一个类别转到另一个类别,一个内函子是一个起始类别和目标类别相同的函子. 与内同态与态射相同. 那么,为什么 monad 必须是内函子? 有一句名言“Monads 只是属于内函子范畴的幺半群".幸运的是,其他人已经在在这个答案中很好地解释了这一点. mo ..
发布时间:2022-01-02 13:56:48 其他开发

为什么 C# 是一种函数式编程语言?

有人说 C# 可以被视为一种函数式编程语言,尽管它被广泛认为是一种面向对象的编程语言. 那么,是什么特性集使 C# 成为一种函数式编程语言? 我只能想到: 委托(即使没有匿名方法和 lambda 表达式) 关闭 还有什么吗? 解决方案 C# 借鉴了 ML 和 Haskell 的很多特性,例如: C# 2.0 为我们带来了参数多态性(或“泛型").我听说 Do ..
发布时间:2022-01-02 13:56:43 C#/.NET