Questions tagged «functional-programming»

函数式编程是一种范式,它试图通过对函数的链式评估来解决计算问题,这些函数的输出由输入决定,而不是由程序状态决定。在这种编程方式中,不赞成使用副作用和可变数据,并且通常严格隔离它们。

1
有什么直觉可以支持在Haskell中将Maybe构造函数称为“ Just”?
像这样的可选类型的直觉Maybe Int是:要么没有 Int(因此Nothing存在),要么有一些 Int。那里有东西。 对我来说,我们将类型构造器称为“负数”情况是有意义的Nothing,因为这恰好意味着-那里没有Int。但是,为什么在重点在于实际存在的东西的情况下使用“ 只是 ”一词呢? 对我来说,“ Just”一词的含义是它所描述的事物少于替代事物。与实际存在的事物相反 例如, 你今晚有事吗? B:没有;我只是待在家里看电视。 答:您是否调查过房屋周围令人毛骨悚然的鬼声? B:是的,事实证明它实际上只是一只猫头鹰。 显然,我缺乏这种命名选择所基于的直觉。它是什么?因为对我来说,Just字样与它在Maybe类型中的用法相反。

2
我们真的可以在OOP中使用不变性而不丢失所有关键的OOP功能吗?
我看到了使程序中的对象不变的好处。当我真正地为自己的应用程序考虑一个好的设计时,我常常自然而然地想到我的许多对象都是不可变的。我常常想让所有对象保持不变。 这个问题涉及相同的想法,但没有答案表明什么是不变性的好方法以及何时实际使用它。是否有一些好的不变设计模式?总体思路似乎是“使对象不可变,除非您绝对需要更改它们”,这在实践中毫无用处。 我的经验是,不变性将我的代码越来越多地驱动到功能范式,并且这种发展总是会发生: 我开始需要持久性(在功能上)数据结构,例如列表,地图等。 使用交叉引用非常不方便(例如,树节点引用其子节点,而子节点引用其父节点),这使我根本不使用交叉引用,这又使我的数据结构和代码更具功能性。 继承不再有任何意义,我开始改用合成。 OOP的整个基本概念(如封装)开始瓦解,而我的对象开始看起来像函数。 在这一点上,我几乎不再使用OOP范例中的任何内容,而可以切换到纯函数式语言。因此,我的问题是:是否有一种一致的方法来进行良好的不可变OOP设计,或者总是总是这样,当您将不可变的想法发挥到最大潜力时,您总是最终会使用一种功能语言进行编程,而该语言不再需要OOP世界中的任何东西?是否有任何好的指导方针来决定哪些类应该是不可变的,哪些应该保持可变以确保OOP不会崩溃? 为了方便起见,我将提供一个示例。让我们拥有一个ChessBoard不可变棋子的不可变集合(扩展抽象类)Piece)。从OOP的角度来看,一块负责从板上的位置生成有效的移动。但是要生成移动,棋子需要引用其棋盘,而棋盘需要引用其棋盘。好了,有一些技巧可以根据您的OOP语言创建这些不可变的交叉引用,但是它们很难管理,最好不要用它来引用其董事会。但是由于不知道棋盘的状态,所以棋子无法产生移动。然后,片段变成仅包含片段类型及其位置的数据结构。然后,您可以使用多态函数来生成各种片段的移动。这在函数式编程中是完全可以实现的,但是如果没有运行时类型检查和其他不良的OOP惯例,在OOP中几乎是不可能的...然后,

6
在非OO中如何编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 在阅读有关OOP缺点的严厉文章以支持其他一些范例的过程中,我遇到了一个例子,我发现它没有太多的缺点。 我想对作者的论点持开放态度,尽管我从理论上可以理解他们的观点,但尤其是一个例子,我很难想象如何用FP语言更好地实现它。 来自:http : //www.smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end // Consider the case where “SimpleProductManager” is a child of // “ProductManager”: public class SimpleProductManager implements ProductManager { private List products; public List getProducts() { return products; } public void increasePrice(int percentage) { if (products != null) { for (Product product : …


2
Haskell内存效率-哪种方法更好?
我们正在基于修改后的二维语法语法实现矩阵压缩库。现在,我们对数据类型有两种方法-如果使用内存,哪种方法更好?(我们要压缩一些东西;))。 语法包含恰好有4个Productions的NonTerminals或右侧的Terminal。我们将需要Productions的名称来进行相等性检查和语法最小化。 首先: -- | Type synonym for non-terminal symbols type NonTerminal = String -- | Data type for the right hand side of a production data RightHandSide = DownStep NonTerminal NonTerminal NonTerminal NonTerminal | Terminal Int -- | Data type for a set of productions type ProductionMap = Map …


5
计算函数是否纯函数
根据维基百科: 在计算机编程中,如果关于函数的以下两个语句均成立,则函数可以描述为纯函数:在给定相同的参数值的情况下,函数始终求值相同的结果值。函数结果值不能依赖于任何隐藏的信息或状态,这些信息或状态可能随着程序执行的进行或程序的不同执行之间的变化而变化,也不能依赖于I / O设备的任何外部输入。结果评估不会引起任何语义上可观察到的副作用或输出,例如可变对象的突变或输出到I / O设备。 我想知道是否有可能编写一个可以计算一个函数是否纯净的函数。JavaScript中的示例代码: function sum(a,b) { return a+b; } function say(x){ console.log(x); } isPure(sum) // True isPure(say) // False

1
为什么Scala要求函数具有显式的返回类型?
我最近开始学习在Scala编程,到目前为止,它很有趣。我真的很喜欢在另一个函数中声明函数的功能,这似乎很直观。 关于Scala的一个烦恼是,Scala在其函数中需要显式的返回类型。而且我觉得这阻碍了语言的表达能力。同样,很难用该要求进行编程。也许是因为我来自Javascript和Ruby舒适区。但是对于像Scala这样在应用程序中具有成千上万个连接函数的语言,我无法想象如何头脑风暴,确切地讲出我正在编写的特定函数应该在递归之后返回的类型。 对于函数的显式返回类型声明的这种要求,对于像Java和C ++这样的语言,请不要打扰我。Java和C ++中的递归发生时,通常最多要处理2到3个函数。从来没有像Scala这样将多个功能链接在一起。 因此,我想我想知道是否有充分的理由解释为什么Scala应该要求具有显式返回类型的函数?

3
是更好的做法是在类中预初始化属性,还是在过程中添加它们?
很抱歉,这是一个绝对如此愚蠢的问题,但是我很好奇目前存在的最佳做法,而且我似乎在Google上找不到很好的答案。 在Python中,我通常使用一个空类作为超级类数据结构容器(有点像JSON文件),并在此过程中添加属性: class DataObj: "Catch-all data object" def __init__(self): pass def processData(inputs): data = DataObj() data.a = 1 data.b = "sym" data.c = [2,5,2,1] 这给了我极大的灵活性,因为容器对象实际上可以存储任何东西。因此,如果出现了新的需求,我将其添加为DataObj对象的另一个属性(我在代码中传递了该属性)。 但是,最近(FP程序员)给我留下了深刻的印象,那就是这是一种糟糕的做法,因为这使得很难阅读代码。必须仔细阅读所有代码,以找出DataObj实际具有的属性。 问题:如何在不牺牲灵活性的情况下重写此代码,以实现更大的可维护性? 我可以采纳函数式编程中的任何想法吗? 我正在寻找最佳实践。 注意:一种想法是使用一个期望遇到的所有属性来预先初始化该类,例如 class DataObj: "Catch-all data object" def __init__(self): data.a = 0 data.b = "" data.c = [] def processData(inputs): data = …

3
Scala或Clojure函数式编程最佳实践
我做了很多自学编码,并获得了并行编程模型的经验:Actor,软件事务存储,数据流。 当我尝试将这些体系结构应用于现实生活时(应用于高负载Web应用程序中),任何模型都不支持数据的持久性和持久性。现实生活中的任务需要最后保存数据。这意味着我仍然必须使用数据库并捕获数据库同步,可能的可伸缩性瓶颈等。 有谁知道使用Akka Actor 或软件事务存储器并最终实现持久性的体系结构(src或文本,图表或蓝图)的好例子吗? 欢迎在现实生活中使用事务处理内存,参与者,数据流,元组空间的任何好的示例/想法。

5
将24小时降水值列表转换为按小时总计
假设我有一个按小时排列的降水值列表,每个值都显示按日期排序的前24小时内发生了多少降雨。例如: { '2012-05-24 12:00': 0.5, // .5" of rain from 5/23 12:00 - 5/24 11:59 '2012-05-24 11:00': 0.6, // .6" of rain from 5/23 11:00 - 5/24 10:59 '2012-05-24 10:00': 0.6, // .6" of rain from 5/23 10:00 - 5/24 09:59 ... '2012-05-23 10:00': 0 } 是否有一项策略/算法来确定每个小时中的降雨量?我似乎无法解决这个问题。我知道这并不像对差异求和那样简单。 数据集的可视化 P(N) [.....======================] …

4
使用“混合”语言进行设计:面向对象的设计还是功能编程?
在过去的几年中,我喜欢使用的语言变得越来越“实用”。我现在使用的是一种“混合”语言:C#,F#,Scala。我喜欢使用与域对象相对应的类来设计我的应用程序,并使用使编码更容易,更简洁和更安全的功能功能(尤其是对集合进行操作或传递函数时)。 但是,当涉及到设计模式时,这两个世界会“冲突”。我最近遇到的特定示例是观察者模式。我希望生产者在创建或更改项目时通知其他一些代码(“消费者/观察员”,例如数据库存储,记录器等)。 我最初是这样“功能性地”完成的: producer.foo(item => { updateItemInDb(item); insertLog(item) }) // calls the function passed as argument as an item is processed 但是我现在想知道是否应该使用更多的“ OO”方法: interface IItemObserver { onNotify(Item) } class DBObserver : IItemObserver ... class LogObserver: IItemObserver ... producer.addObserver(new DBObserver) producer.addObserver(new LogObserver) producer.foo() //calls observer in a loop 两种方法的优缺点是什么?我曾经听过一位FP专家说,那里的设计模式仅是由于语言的局限性,这就是为什么功能语言很少的原因。也许这可能是一个例子? 编辑:在我的特定情况下,我不需要它,但是..您将如何以功能方式实现“观察者”的删除和添加?(即,您将如何实现模式中的所有功能?)例如,仅传递一个新函数?

1
功能语言中的UI模式
我想开始摆弄ClojureScript,但是我对某些要点感到困惑。我的问题是,当您尝试进行功能性工作时,什么是应对来自用户交互的状态更改的好方法? 让我举几个例子。我考虑过在浏览器中运行的应用程序,但是我认为这个问题更为普遍。当然,某些事情将会改变-至少是DOM。但我想了解如何组织其余代码以使用不可变数据结构。 1)说我想将一些事件附加到某些DOM对象。这在大多数情况下都不是很难做到的:在创建节点时,将其附加有各种事件处理程序的哈希映射。但是考虑使用事件委托的情况。然后,在创建新节点时,可以将事件处理程序附加到可能已经存在的某个父节点。因此,您将不得不更改与现有节点关联的哈希。 2)说我正在为输入字段设计一个自动完成模块。每次用户按下一个键,我都可以致电服务器以获取建议。这很简单。但是现在假设我想对其进行一些优化。如果我知道所有结果都匹配,foo那就没有必要再要求所有结果匹配了foobar; 我可以过滤前者。所以我需要建立某种缓存。每当用户插入一个新单词(而不是先前输入的单词的超集)时,此缓存就会更新。再说一遍:如何为缓存建模?最合理的方法似乎是将单词映射到结果的哈希映射,但是它应该是可变的。 您能否提出一些模式,以使其更容易将由于用户交互而引起的更改合并到功能设计中?

5
函数式编程中的数据结构
我目前正在使用LISP(尤其是Scheme和Clojure),并且想知道函数式编程语言中如何处理典型的数据结构。 例如,假设我想使用图形寻路算法解决问题。通常如何用一种功能编程语言(主要是对可以应用于LISP的纯功能样式感兴趣)来表示该图?我是否会完全忘记图并以其他方式解决问题?

3
使用Scala和LWJGL的简化游戏的函数式编程方法
我是一名Java命令程序员,我想了解如何基于功能性编程设计原则(特别是引用透明性)生成简单版本的Space Invaders。但是,每当我尝试考虑一种设计时,我都会迷失在极端可变性的泥潭中,而这种可变性是函数式编程纯粹主义者所避免的。 为了学习函数式编程,我决定尝试使用LWJGL在Scala中创建一个非常简单的2D交互式游戏Space Invader(注意缺少复数形式)。以下是基本游戏的要求: 用户在屏幕底部分别通过“ A”和“ D”键向左和向右移动 用户发射的子弹由空格键直接向上发射,两次射击之间的最小间隔为0.5秒 两次射击之间的随机时间为0.5到1.5秒,直接发射外星飞弹 在原始游戏中故意遗漏的是WxH外星人,可降解的防御屏障x3,屏幕顶部的高速飞碟船。 好的,现在到实际的问题域。对我来说,所有确定性部分都是显而易见的。那些不确定的部分似乎阻碍了我思考方法的能力。确定性部分是子弹一旦存在的轨迹,外星人的连续运动以及由于击中玩家的船或外星人(或两者)而引起的爆炸。对我来说,不确定的部分正在处理用户输入流,处理用于确定外来子弹射击的随机值以及处理输出(图形和声音)。 这些年来,我可以做(并且已经做过很多)这类游戏。但是,所有这些都来自命令式范式。而且LWJGL甚至提供了一个非常简单的Java版的“太空侵略者”(我开始使用Scala作为Java(不带分号)将其迁移到Scala)。 以下是围绕该领域讨论的一些链接,似乎没有一个人以Java / Imperative编程人员会理解的方式直接处理这些想法: 纯功能复古游戏,第1部分,詹姆斯·海格(James Hague) 类似的堆栈溢出帖子 Clojure / Lisp游戏 Haskell游戏堆栈溢出 Yampa(在Haskell中)功能响应式编程 It appears that there are some ideas in the Clojure/Lisp and Haskell games (with source). Unfortunately, I am not able to read/interpret the code into mental models …

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.