我愿意在我的公司做一些F#的培训,他们似乎表现出了一些兴趣。他们通常是VB6和C#程序员,他们对编程的热情不高。话虽这么说,当您考虑功能问题时,我觉得编写正确的代码会更容易,因此他们一定会从中受益。
谁能提供一些有关我应该如何处理此问题的建议?
主意
- 不要专注于语法,而应该专注于如何使用该语言及其所推广的习语。
- 试想一下以命令式方式编写的示例很痛苦,但是以声明式方式编写时却转换为优雅的代码。
make
比F#或Caml更像是一种声明性语言!(具有讽刺意味的是,这使您的工作更加轻松。)
我愿意在我的公司做一些F#的培训,他们似乎表现出了一些兴趣。他们通常是VB6和C#程序员,他们对编程的热情不高。话虽这么说,当您考虑功能问题时,我觉得编写正确的代码会更容易,因此他们一定会从中受益。
谁能提供一些有关我应该如何处理此问题的建议?
主意
make
比F#或Caml更像是一种声明性语言!(具有讽刺意味的是,这使您的工作更加轻松。)
Answers:
对我来说,函数式编程是一个奇怪的野兽。我学习了F#和Haskell,编写了一些简单的程序并且热爱使用它们,但是却从未像某些人谈论的那样被“启示录闪过”。但是渐渐地,我注意到越来越多的人在编写本来就是不可变的代码,将任务分解为更多,更小的函数,并尝试更多地使用委托。如果您喜欢它的话,那是一种潜移默化的事情,因为这些技术的价值不言而喻。
现在,更实际地用于培训:我发现有两个概念确实使函数编程成为我的一种风格。
首先,FP样式基于数据的结构,而不是像OOP中那样构成。我将C#中的List之类的东西看成是生成类型安全列表的巧妙技巧,它可以将类型(字符串)组成另一个类型(列表)。学习完FP之后,我现在将更像Monads来研究泛型。List是代码可以采用的结构化形式,它装饰字符串。
其次,对于FP工作于递归和重复,而OOP工作于可变性和循环的想法可能对C#/ ASP程序员更有用。我现在倾向于将ASP页面的生命周期视为一种FP:每个请求都是在整个生命周期中从头开始处理的,因此整个页面实际上是一个大型的缓慢递归程序。如果您可以缩小这个概念的范围,那么您将更好地了解如何在命令循环周围构造函数的循环,这些循环需要接收数据,对其进行操作并返回新数据,而不是修改旧数据。
至少对我而言,用这种方法克服的最棘手的障碍是,在使用可变对象时浪费您大量资源的沉没感会节省大量内存。在GC中,我们值得信赖,而我只需要学会放开对性能的关注,直到我实际看到程序正在运行并验证是否存在任何问题为止,如果可以,可以使用探查器确切地查看问题所在。
我建议:
许多命令式编程语言(Ada,C / C ++,Turbo Pascal,FoxPro)都可以定义指向可在运行时求值的函数或过程名称文字的指针(以及调用该文字之后命名的过程)。
传统示例是C中的qsort。在此基础上,您可以定义可以对数据结构执行其他算法的算法。显然,这只是功能编程的一小部分。但是我发现这是让这个想法扎根的好起点。
一旦陷入困境,您就可以开始研究其他事物(不变性,无共享等)。
谁能提供一些有关我应该如何处理此问题的建议?
当然:
仔细选择示例,以便您的F#代码不仅可以优雅地解决问题,而且比C#/ VB可能解决的问题要优雅得多。模式匹配和类型推断是您的朋友。
用一个例子来强调F#中新功能的好处,例如异步工作流,活动模式。
在适当的时候,不要害怕使用可变数据结构给出不纯示例。F#不纯是有原因的。
不要把F#当作灵丹妙药。描述F#不太适合的应用程序,以及比其他.NET语言更适合的应用程序。
指出他们可以研究的玩具样本以及使用F#的成功现实项目(Bing AdCenter,Halo 3等)。
按照F#如何帮助他们更轻松地解决问题的方式解释一切。避免宗教辩论。对F#保持正面评价,而不对其他语言保持负面评价。用事实和证据武装他们,但让他们得出自己的结论。