什么是一个好的第一个函数式编程项目?[关闭]


19

什么是一个好的第一个函数式编程项目?

我希望在我的单身汉项目中取得圆满成功,并且希望通过功能编程项目来完成它。我们不是在学校学习的,但是我们鼓励我们尝试自己学习新事物,而且我认为学习新的范例不仅对我来说是一种很好的练习,而且对于老师来说也可能是一件有趣的事情。 。

问题是我想提前一点开始我的项目,以利用暑假的机会,更好地理解函数式编程,并熟悉一种语言。

您会说这是一个很好的实践项目,有点挑战,但同时也让我学习了语言,范例等。那么您认为对我的单身汉项目而言,这是一个好项目(更高级的项目)吗?

对于进入函数式编程的最佳语言的建议也将不胜感激。


1
“我应该选择哪种语言”和项目选择问题均不在这里。请参阅常见问题解答此元讨论以获取更多详细信息。
亚当·李尔

Answers:


10

如果选择相对数学或逻辑上的东西,通常会更容易-函数式编程语言通常非常适合表示从给定输入到输出的某种形式的转换的应用程序。

一些想法,按难度排列:

  • 遗传算法-编写将解决方案演化为特定任务的程序,其中解决方案以简单的DSL表示。在构建小型机器人以在2D网格中寻找食物并发展各种策略之前,我玩得很开心

  • 解析组合器-建立一个解析器组合器库,使您能够使用高阶函数为任意语言构造一个解析器。

  • 如果你真的想要一个挑战,你可以尝试编写电脑游戏......要知道,这是一个棘手的任务,因为游戏有一个巨大的可变状态量这可能会非常棘手的函数式编程风格来管理。希望了解比您想了解的更多有关monad等的知识。

我建议Clojure作为一种实用的功能语言。我已经使用了大约18个月,对此选择感到非常满意。主要原因是:

  • 并发性 -Clojure具有出色的STM系统,在我看来,它是目前世界上多核并发性最佳的语言。如果您想了解为什么这是如此特别,请参见以下视频:http : //www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • 这是一个Lisp-因此,由于“代码就是数据”的理念,它对于基于宏的元编程(编写程序的程序,遗传算法等)非常有用。
  • 实用的函数式编程 -Clojure样式具有很高的功能性(很多强调高阶函数,惰性序列等),但它并不像Haskell那样完全纯净。有很多不错的工具来处理可变状态和副作用
  • 动态 -Clojure默认情况下是一种动态语言。我发现这极大地提高了生产率。但是,如果您想获得静态类型的性能优势,可以在以后选择添加静态类型提示。
  • 完全编译 -始终遵循Clojure代码(即使您执行“评估”),因此您可以获得相当不错的性能-肯定比我使用过的大多数动态语言都要好。
  • 您可以免费访问JVM生态系统中的所有库和工具。因此,与具有有限库的学术语言不同,您可以轻松访问Java Universe中的任何内容

您可以使用以下方法轻松尝试基础知识:


我选择了您的问题答案,因为它回答了我所有的问题。非常感谢您抽出宝贵的时间。
Meme,

Haskell也具有STM;(
替代

@mikera:要使用JVM,您是否尝试过ABCL?我尝试了一下,仅举了一个小例子,但我几乎没有经验。(我的待办事项清单中也有Clojure书,但这是另一个故事,如果您有使用ABCL和Java的经验,我很好奇)。
乔治

@Giorgio:ABCL似乎是Common Lisp在JVM上的不错实现。OTOH Clojure具有为JVM设计的优点,并结合了更多“现代”创新,并具有更大的社区动力。我认为这实际上取决于您是否关心维护Common Lisp向后兼容性。
mikera

9

在开始考虑特定项目之前,请先学习函数式编程的基础知识,以便您可以很好地了解适合的项目类型。

最好的入门场所可能是基于Lisp的方言的计算机程序的结构和解释(SICP)。这是经典的CS文本,全文可在线获得(提供了链接)。

如果您想花大钱,并使用针对JVM的更现代的功能语言,请查看Clojure。甚至还有专门针对Clojure的SICP的改编版本。

翻阅SICP文本,您将了解为什么函数式编程非常适合某些类型的任务,而这些练习可能会激发出一个成熟的项目。如果你选择去Clojure的路线,并且要检查一些现有的项目,也有一些很好的链接在这里


感谢您提供本书的链接。我将阅读该书以获得更好的理解。
Meme

您今天读过SICP吗?
MattyD 2011年

3

定量分析

如果您发现金融学有些有趣,那么使用函数式编程进行一些量化的工作就很合适,因为它是一种非常算法的算法。我说的是投资组合理论以及诸如Sharpe和Sortino比率之类的东西。制作一个应用程序来分析基金的回报,并提供不同的统计数据,图表等。

我之所以推荐F#,只是因为我认为它是一种入门易用的函数式语言,并且具有良好的工具和良好的框架作为后盾。其他替代方法是Lisp和Clojure,但学习起来有些困难。


从高层次上讲,您确实可以以功能性方式做很多事情。例如,人们使用功能语言来描述异国期权收益。但是,当您深入研究诸如计算PCA,求解非线性方程等之类的基础知识时,这些算法将变得越来越迭代,因此最好还是以旧方式对它们进行编码。
quant_dev

1
我不会说,根据我的经验,定量分析全是关于按序列运行算法。我实现了定量的东西在C#中,它是非常符合LINQ一致,至少在投资组合理论类的东西
Homde

那么算法本身的实现呢?
quant_dev

在大多数情况下,我认为没有问题,对吗?计算锐利比率,首先从收益系列计算出年化收益,然后将该值与无风险利率和波动率一起使用:(annualizedReturn-riskFreeRate)/波动率。功能语言
无法解决

定价模型校准如何?
quant_dev

3

首先,您可以尝试在F#中实现一个小型二十一点游戏。这是在此简短视频教程中分配的一项家庭作业项目。网络(以及其中一个视频)中也提供了解决方案。


2

您可以使用OCaml为scheme或lisp编写解释器。


还需要注意的是,甚至还有一本关于haskell编写方案的haskell书。
替代

2

您在想哪种功能语言。每个人都有不同的特征。对我影响最大的一种语言是Haskell,我建议您也这样做。


我诚实地想到F#的原因主要是因为在丹麦Microsoft一切都很流行,但是我阅读的意见越多,我就对这一决定表示怀疑。我想要一种可以主要帮助我学习该范式的语言,在我确定如果需要或想要学习另一种语言之后,就不难了。
Meme,

在很大程度上取决于您所在的位置和您的工作。对我们而言,Microsoft编程技术无用,因为它们不支持我们的主平台。但我离题:如果您想使用F#,太好了,但是请打开一个新的F#特定问题。

我不想用那个。我还没决定 无论如何,关于使用语言的问题是一个次要问题。
Meme

在这种情况下,请找到一个项目,然后寻求解决方案的建议。例如Prolog非常适合决策树搜索。Haskell非常适合模式匹配。Lisp非常适合在运行时根据数据构造和操作Lisp程序。

0

您还可以为一些开源项目做出贡献。

例如,在Frege编程语言项目中,有许多工作要做。例如,您可能会关心移植基础Haskell库。这将使您在工作时像Haskell专家一样。

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.