为什么在一个势在必行的项目中使用函数式语言?
答案 0 :(得分:6)
许多任务固有地通过功能概念来解决,例如可组合计算。在项目中遇到这些问题是可行的,否则这些问题是以面向对象的方式开发的。
工作的最佳工具独立于该工具的主导范式。
答案 1 :(得分:2)
Java和C ++等语言中的许多方法都可以使用FP概念(如高阶函数,currying,闭包等)以更易读和更密集的形式编写。
有关许多有趣的例子,请参阅Scala。
答案 2 :(得分:2)
如果您的项目确实是必不可少的,那么您可能不需要纯函数式语言。但是你可能仍然想要一种具有功能特性的语言;功能样式以与面向对象样式解决高级结构相同的方式处理低级代码结构。两者都允许您以语言支持的方式打包某些常见模式。
在一个主要的命令式项目中,函数式在表达式和语句级别很有用,允许您抽象出常见的循环和序列:
例如,采用这种常见模式:
newlist = []
for x in oldlist:
y = dosomething(x)
newlist.append(y)
那是map
:
newlist = map(dosomething, oldlist)
或者这个:
total = 1
for n in numbers:
total = total * n
成为fold
(也称为reduce
):
total = fold(*, 1, numbers)
势不可挡的风格并没有很好地解决这种低级复制问题 - 因此“我希望每次键入for(int i = 0; ...)
时我都有镍。”即使在没有功能特性的OO语言中,方法内部的代码与类似的非OO语言也没有太大区别。
一些IDE通过提供代码片段来解决这个问题。这以错误的方式解决了缺乏抽象能力的问题。处理重复模式的方法不是鼓励对变量名称使用小孔进行剪切和粘贴,而是将模式抽象为可重用的单元。
注意:我解决了在命令式项目中嵌入功能代码的问题。功能风格的自上而下的项目看起来会有所不同。以下是类似Stack Overflow问题的一些链接:
答案 3 :(得分:2)
可能最常见的原因是本地化和限制必要部分(即,潜在危险且难以调试,分析和维护)。
答案 4 :(得分:0)
应用程序开发人员面临的一个常见问题是构建查询:“我希望所有在过去一年中花费10万美元的18岁以上的客户。”定义返回所有客户的查询,然后按一个标准过滤,然后另一个标准,最后是第三个过程的过程称为组成查询。组合是功能方法的强大功能,这意味着查询定义问题和功能解决方案是完全匹配的。要在流行的面向对象语言中查看此操作,请参阅C#和LINQ
答案 5 :(得分:0)
为什么在一个势在必行的项目中使用函数式语言?
一些例子:
Mathematica内核是用C的专有方言编写的.Mathematica是一种函数式语言,因此它可以更容易地实现许多数学算法,因此,它成为实现大部分数学算法的首选语言。 Mathematica本身。回顾一下,这是一个巨大的成功,因为它可以使用更具表现力的语言快速,廉价地实现更多算法。
Joule是来自欧洲能源交易市场领导者的交易员的前端GUI应用程序。尽管Joule中的大多数代码行都是C#,但他们选择在F#中实现它的某些部分。特别是,隐含的价格引擎结合了真实的出价和相关合同的要求,以创建隐含的出价和要求,完全用F#编写。回顾一下,这是一个巨大的成功,因为它用相对较小的(~1kLOC)F#代码库取代了大量的(~50kLOC)C ++代码库,可以更快地完成同样的事情。 Joule隐含价格引擎的作者撰写了一篇相关文章here。
微软的Halo 3计算机游戏和Bing搜索引擎都有一些用微软自己的函数式语言F#编写的密集数学代码。