是否有人对函数式编程有一个很好的思维模型或隐喻,可以引用现实世界中的某些东西?
直观的面向对象编程对我来说很有意义。有些东西具有属性,有时它们也可以对它们的属性(方法)进行填充或执行计算。(例如:汽车,造型,猫)。
我对函数式编程毫无恶意,并且我对辩论两者的优点不感兴趣。与面向对象编程一样,我只需要一个隐喻或思维模型即可使用。
在功能范式中进行编程有哪些好的心理模型或现实世界隐喻?关于由功能处理功能组成的功能的某些说明,使一个功能没有固定的位置来站立和思考。
是否有人对函数式编程有一个很好的思维模型或隐喻,可以引用现实世界中的某些东西?
直观的面向对象编程对我来说很有意义。有些东西具有属性,有时它们也可以对它们的属性(方法)进行填充或执行计算。(例如:汽车,造型,猫)。
我对函数式编程毫无恶意,并且我对辩论两者的优点不感兴趣。与面向对象编程一样,我只需要一个隐喻或思维模型即可使用。
在功能范式中进行编程有哪些好的心理模型或现实世界隐喻?关于由功能处理功能组成的功能的某些说明,使一个功能没有固定的位置来站立和思考。
Answers:
函数式编程就是将较小的函数粘合在一起以获得结果。体面的心理模型(至少对我而言)是一条装配线。组成的每个功能都是组装过程中的又一个步骤。在此考虑此功能:
smallest = head . sort
在Haskell中,此函数将返回列表中的最小元素。组装流水线首先对输入进行排序,然后返回第一个元素(假设它的排序最小到最大)。如果我们只想获得最小的偶数,则可以将组装流水线更改为如下所示:
smallestEven = head . sort . filter even
这只是传送带上的又一步。
简而言之,函数只是描述将原始输入(零件)转换为已处理商品(输出)所采取的步骤。
(f . g) (x)
装置f(g(x))
或f . g
手段\x -> f (g (x))
。
.
定义的;这并不是Haskell 通常的工作方式。您也可以|>
在Haskell中定义F#的前向管道运算符()并编写smallest x = (sort x) |> head
,数据将正确流动。只是以为我会指出这一点。
有没有人对函数式编程有好的心智模型?
数学。函数式编程的灵感来自数学并以数学为模型。数学函数没有状态,没有副作用等,FP也是如此。如果您从数学函数的角度考虑FP,而不是使用OO风格的“我如何做到这一点”的方法,那么您将处于良好状态。但是,如果您尝试将OO敏感性带给FP,那么您将与时俱进。
翻书怎么样?
在翻书中,每一页都代表着当时存在的世界。在我们的程序中,世界表示为某种复合数据结构(例如,香蕉在大猩猩的手中,香蕉在丛林的树中)。随后的每个页面都会通过稍微修改前一个表示形式来推进故事。在FP中,持久性数据结构旨在有效地重用以前的结构,以便更改仅提供增量而不提供全新的再现。
可能并不明显的是,我们的翻书中的一页也代表无形资产。例如,如果大猩猩掉落香蕉,我们可能会开始施加重力对其体面和朝向丛林地面的加速度的影响。为了适应这一点,我们将诸如速度和轨迹之类的属性附加到香蕉上。
在我们的程序中,将有一个函数接受一个翻书页面(又称世界状况)作为参数并产生一个新页面。这样,我们的故事就不会实际更改现有对象的状态了。我们只是使用有效的计算方法,用新的页面替换每个页面。
朋友:给定两个人,朋友关系遵循这些一般法律
Monoid:给定多个项目,并且函数接受其中2个项目并返回1,则遵循这些一般定律的monoidal关系
函数式编程是关于概括的,朋友是一种非常普遍的关系,可以在许多情况下看到,但是在所有各种格式中,它通常都遵循上述定律。
认识到支配事物之间关系的法律,您可以创建适用于具有这种关系类型的事物的任何格式的常规实现。在函数式编程中,您尝试识别事物之间的关系,以便可以对其进行分类和一般处理。
您想从现实世界中隐喻吗?查看事物之间的关系,并尝试确定一般法律(如适用于法律以外的事物可能会发生变化的多种情况)。商店的业务员和购物者之间存在某种关系,它具有一些一般性的法律,已经开发了软件来以POS系统的方式促进人们在这种一般性关系中的目标。同样,当您开始看到这些决定事物之间如何关联的一般规律时,就可以开始依赖那些关系的规律来编写软件,而不是依赖某个关系实例的特定细节。
一切都是值,您将函数应用于值(可能是函数)以产生新值,最好不产生任何副作用。
关于函数式编程,关键要意识到的是,一切都是一个值-甚至代码本身也是“值”。
简单的功能编程环境的最佳示例是每个人最喜欢的业务工具-电子表格。电子表格中的每个单元格要么是数据,要么是函数的结果。而且,此功能无法关闭并修改另一个单元格。
当一个人移动到功能性语言,而不是笛卡尔网格的A1
和B42
,功能有名字。这就是全部。
除此以外,还可以添加其他方面……但这是功能编程的核心。不必担心列表的结构或事物的分组。函数式编程是关于将值传递到函数中并取回值,而不会在内存中的其他地方产生任何混乱。
而已。函数式编程是具有名称而不是网格的电子表格。
假设您大致按照以下方式分解句子,它们的功能比面向对象的更多。
The brown cow is in the meadow across the deep river.
因此,我们需要先找到主要短语,然后再找到其余的短语:
The cow (brown)
the meadow (across)
the river (deep)
一气呵成:
sentence: The cow ((the meadow (the river (deep)) (across)) brown)
解析树:
| sentence
| /
| The cow
| / \
| the meadow brown
| / \
| the river across
| \
| deep
简约感染功能性思维;
致敬1890年代的Gottlieb Frege,1930年代的Alan Turing(entschiedungsprobleme),Noam Chomsky(1960年代)。