Questions tagged «functional-programming»

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

5
在无限列表上左右折叠
我对“了解您的Haskell”(很棒的书imo,不要轻描淡写)中的以下文章有疑问: 一个很大的不同是,右折叠在无限列表上起作用,而左折叠则不行!简而言之,如果您在某个时间点取一个无限的列表,然后将其从右侧折叠起来,最终您将到达列表的开头。但是,如果您在某个点取一个无限的列表,然后尝试将其从左向上折叠,那么您将永远无法结束! 我就是不明白这一点。如果您获取一个无限列表,然后尝试从右侧将其折叠起来,那么您将不得不从无穷大的那一点开始,这只是没有发生(如果有人知道您可以使用的语言,请告诉:p )。至少,您必须根据Haskell的实现从那里开始,因为在Haskell foldr和foldl中,不需要使用确定在列表中应该从何处开始折叠的参数。 我同意报价单iff foldr和foldl的参数确定了它们应该在列表中的何处开始折叠,因为有意义的是,如果您从无限的列表开始并从已定义的索引开始折叠,它将最终终止,而实际上不管你从左折开始 您将向无限折叠。但是,foldr和foldl不接受此参数,因此引号没有意义。在Haskell中,无限列表上的左折和右折都不会终止。 我的理解正确吗?还是我缺少什么?


1
什么是“点菜多态”,我如何从中受益?
瑞克·希基(Rick Hickey)在他的演讲“简单易用”中谈到“点菜多态”(视频中约30:00)。在同一上下文中,他还提到了Haskell的类型类和Clojure的多方法(和协议)。 由于我对这些概念不是很熟悉,因此我想了解它在尝试实现简单性时的用处。我对Scala中有关此概念的任何示例或展示特别感兴趣。

1
Spark代码组织和最佳实践
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 因此,在面向对象的世界中花了很多年并始终考虑代码重用,设计模式和最佳实践之后,我发现自己在Spark世界中在代码组织和代码重用方面有些挣扎。 如果我尝试以可重用的方式编写代码,那么它几乎总是会带来性能上的损失,最终我会将其重写为适合我的特定用例的最佳方式。这个常量“写出最适合该特定用例的内容”也会影响代码的组织,因为当“它们都真正属于一起”时,很难将代码拆分为不同的对象或模块,因此我最终只有很少的包含长代码的“上帝”对象复杂转换链。实际上,我经常认为,如果我回顾了当我在面向对象的世界中工作时所写的大部分Spark代码,我会退缩并将其视为“意大利面条式代码”。 我上网冲浪试图找到与面向对象世界的最佳做法相当的东西,但是运气不佳。我可以找到一些函数式编程的“最佳实践”,但是Spark只是增加了一层,因为性能是这里的主要因素。 所以我想问的是,您是否有任何Spark专家找到了一些您可以推荐的编写Spark代码的最佳实践? 编辑 正如评论中所写,我实际上并不希望有人发布有关如何解决该问题的答案,而是我希望这个社区中的某人遇到过一些Martin Fowler类型的人,他曾在某处写过som文章或博客文章。关于如何解决Spark世界中代码组织的问题。 @DanielDarabos建议我举一个例子说明代码组织和性能冲突的情况。虽然我发现我在日常工作中经常遇到此问题,但我很难将其归结为一个很好的最小示例;)但我会尝试的。 在面向对象的世界中,我是“单一责任原则”的忠实拥护者,因此,我将确保我的方法仅负责一件事。它使它们可重用且易于测试。因此,例如,如果我必须计算列表中某些数字的总和(与某些条件匹配),并且必须计算同一数字的平均值,那么我绝对可以创建两种方法-一种计算和,然后计算平均值。像这样: def main(implicit args: Array[String]): Unit = { val list = List(("DK", 1.2), ("DK", 1.4), ("SE", 1.5)) println("Summed weights for DK = " + summedWeights(list, "DK") println("Averaged weights for DK = " + averagedWeights(list, "DK") } def summedWeights(list: …

2
什么时候以及为什么应该在Scala中使用应用函子
我知道Monad可以在Scala中表示如下: trait Monad[F[_]] { def flatMap[A, B](f: A => F[B]): F[A] => F[B] } 我明白了为什么有用。例如,给定两个功能: getUserById(userId: Int): Option[User] = ... getPhone(user: User): Option[Phone] = ... 我很容易编写函数,getPhoneByUserId(userId: Int)因为Option它是monad: def getPhoneByUserId(userId: Int): Option[Phone] = getUserById(userId).flatMap(user => getPhone(user)) ... 现在我Applicative Functor在Scala中看到了: trait Applicative[F[_]] { def apply[A, B](f: F[A => B]): F[A] => F[B] …

8
功能编程和非功能编程
在大学的第二年,我们被“教”了Haskell,我对此几乎一无所知,甚至对函数式编程一无所知。 什么是函数式编程,为什么和/或在什么地方我想用它代替非函数式编程?我是否认为C是一种非函数式编程语言是正确的?

8
逻辑编程与功能编程之间的区别
我读过许多文章试图理解功能和逻辑编程之间的区别,但是到目前为止,我唯一能得出的结论就是逻辑编程通过数学表达式定义程序。但是这种事情与逻辑编程无关。 我真的很希望能对函数式编程与逻辑编程之间的区别有所了解。

11
应用风格的实际用途是什么?
我是Scala程序员,现在正在学习Haskell。很容易找到面向对象概念的实际用例和现实示例,例如装饰器,策略模式等。书和互连网充满了它。 我意识到功能性概念并非如此。恰当的例子:应用剂。 我正在努力为应用程序找到实际的用例。几乎所有的教程和书籍的我所遇到到目前为止提供的示例[]和Maybe。我希望应用程序能够比FP更加适用,因为他们在FP社区中得到了所有关注。 我认为我理解了应用程序的概念基础(也许我错了),并且我一直在等待启蒙的时刻。但这似乎没有发生。从来没有在编程时,我有一阵子会高兴地喊着:“尤里卡!我可以在这里使用应用程序!” (同样,for[]和除外Maybe)。 有人可以指导我如何在日常编程中使用应用程序吗?如何开始发现图案?谢谢!

2
单子vs箭
我对函数式编程中使用的monad和箭头的概念非常熟悉。我也了解它们可以用来解决类似的问题。 但是,对于在任何给定情况下如何选择要使用的选项,我仍然有些困惑。 什么时候应该使用monad,什么时候应该使用箭头?

8
函数式编程的缺陷/缺点
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 您什么时候不想使用函数式编程?那不是很擅长什么? 我更多地是在寻找整个范式的缺点,而不是诸如“未广泛使用”或“没有良好的调试器”之类的东西。到目前为止,这些答案可能是正确的,但是它们将FP视为一个新概念(不可避免的问题),而不是任何固有的品质。 有关: 函数式编程的优点 为什么函数式编程还没有被接管?

2
将选项类型列表压缩为仅包含非不包含元素的最佳方法?
我出乎意料地遇到麻烦,从“选项”列表转到仅包含“某些”元素的列表。 我最初的尝试是: let ga = List.filter (fun xx -> match xx with | Some(g) -> true | None -> false) gao 但是,当然,此结果类型仍然是“选项列表”。我不知道如何使用List.map来压缩它,因为您必须在match语句中处理所有情况。我有一个丑陋的解决方案,但我想知道是否还有更好的方法。 丑陋: let rec gOptRemove gdec gacc = match gdec with | head :: tail -> match head with | Some(a) -> gOptRemove tail (a :: gacc) | None …

5
为什么追加到列表不好?
我最近开始学习scala,并且遇到了::(cons)函数,该函数位于列表的前面。 在《 Scala中的编程》一书中,它指出没有附加功能,因为附加到列表的性能为o(n),而前置的性能为o(1) 关于那句话,我有些不对劲。 性能不取决于实现吗?难道不能简单地实现带有向前和向后链接的列表并将第一个和最后一个元素存储在容器中? 我想的第二个问题是,当我有一个列表1,2,3并想在其末尾加4时该怎么办?

1
将类型与数据构造函数相关联的ADT编码有什么问题?(例如Scala。)
在Scala中,代数数据类型被编码为sealed一级类型层次结构。例: -- Haskell data Positioning a = Append | AppendIf (a -> Bool) | Explicit ([a] -> [a]) // Scala sealed trait Positioning[A] case object Append extends Positioning[Nothing] case class AppendIf[A](condition: A => Boolean) extends Positioning[A] case class Explicit[A](f: Seq[A] => Seq[A]) extends Positioning[A] 随着case classES和case objectS,斯卡拉产生了一堆东西一样equals,hashCode,unapply(通过模式匹配使用)等这使我们许多关键特性和传统的ADT功能。 但是,有一个关键的区别–在Scala中,“数据构造函数”具有自己的类型。比较以下两个示例(从相应的REPL复制)。 // Scala …


3
是否有Scala身份功能?
如果我有类似a的东西List[Option[A]]并且想要将其转换为a List[A],则标准方法是使用flatMap: scala> val l = List(Some("Hello"), None, Some("World")) l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World)) scala> l.flatMap( o => o) res0: List[java.lang.String] = List(Hello, World) 现在o => o只是一个身份功能。我本以为可以采取一些措施: l.flatMap(Identity) //return a List[String] 但是,由于您无法生成一个,所以我无法执行此操作object。我尝试了几件事无济于事。有人有这样的工作吗?

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.