尝试向命令式程序员讲解声明式编程时,有哪些好的做法?


13

我愿意在我的公司做一些F#的培训,他们似乎表现出了一些兴趣。他们通常是VB6和C#程序员,他们对编程的热情不高。话虽这么说,当您考虑功能问题时,我觉得编写正确的代码会更容易,因此他们一定会从中受益。

谁能提供一些有关我应该如何处理此问题的建议?

主意

  • 不要专注于语法,而应该专注于如何使用该语言及其所推广的习语。
  • 试想一下以命令式方式编写的示例很痛苦,但是以声明式方式编写时却转换为优雅的代码。

F#和声明式编程
P Shved

@Pavel-这是一个问题吗?
ChaosPandion 2010年

3
@Pavel-好吧,请解释一下您为什么要发言?这是您第二次发表非常含糊的评论。这很不礼貌。
ChaosPandion

3
en.wikipedia.org/wiki/Declarative_programming函数式编程一种声明式编程。另外,+ 1,很好的问题。
请注意-想起

2
@Chaos,在我看来,F#不支持声明性编程范例。它热切的评估和命令式功能使该语言仅是一种便捷的,类似于函数的形式,表示与您在C#中使用的命令式语句相同。来吧,make比F#或Caml更像是一种声明性语言!(具有讽刺意味的是,这使您的工作更加轻松。)
P Shved 2010年

Answers:


5

对我来说,函数式编程是一个奇怪的野兽。我学习了F#和Haskell,编写了一些简单的程序并且热爱使用它们,但是却从未像某些人谈论的那样被“启示录闪过”。但是渐渐地,我注意到越来越多的人在编写本来就是不可变的代码,将任务分解为更多,更小的函数,并尝试更多地使用委托。如果您喜欢它的话,那是一种潜移默化的事情,因为这些技术的价值不言而喻。

现在,更实际地用于培训:我发现有两个概念确实使函数编程成为我的一种风格。

首先,FP样式基于数据的结构,而不是像OOP中那样构成。我将C#中的List之类的东西看成是生成类型安全列表的巧妙技巧,它可以将类型(字符串)组成另一个类型(列表)。学习完FP之后,我现在将更像Monads来研究泛型。List是代码可以采用的结构化形式,它装饰字符串。

其次,对于FP工作于递归和重复,而OOP工作于可变性和循环的想法可能对C#/ ASP程序员更有用。我现在倾向于将ASP页面的生命周期视为一种FP:每个请求都是在整个生命周期中从头开始处理的,因此整个页面实际上是一个大型的缓慢递归程序。如果您可以缩小这个概念的范围,那么您将更好地了解如何在命令循环周围构造函数的循环,这些循环需要接收数据,对其进行操作并返回新数据,而不是修改旧数据。

至少对我而言,用这种方法克服的最棘手的障碍是,在使用可变对象时浪费您大量资源的沉没感会节省大量内存。在GC中,我们值得信赖,而我只需要学会放开对性能的关注,直到我实际看到程序正在运行并验证是否存在任何问题为止,如果可以,可以使用探查器确切地查看问题所在。



1

许多命令式编程语言(Ada,C / C ++,Turbo Pascal,FoxPro)都可以定义指向可在运行时求值的函数或过程名称文字的指针(以及调用该文字之后命名的过程)。

传统示例是C中的qsort。在此基础上,您可以定义可以对数据结构执行其他算法的算法。显然,这只是功能编程的一小部分。但是我发现这是让这个想法扎根的好起点。

一旦陷入困境,您就可以开始研究其他事物(不变性,无共享等)。


更正:我的意思是说,您可以定义参数化算法,该参数化算法可以将OTHER算法作为参数并在数据结构上执行。
luis.espinal,2010年

1

谁能提供一些有关我应该如何处理此问题的建议?

当然:

  • 仔细选择示例,以便您的F#代码不仅可以优雅地解决问题,而且比C#/ VB可能解决的问题要优雅得多。模式匹配和类型推断是您的朋友。

  • 用一个例子来强调F#中新功能的好处,例如异步工作流,活动模式。

  • 在适当的时候,不要害怕使用可变数据结构给出不纯示例。F#不纯是有原因的。

  • 不要把F#当作灵丹妙药。描述F#不太适合的应用程序,以及比其他.NET语言更适合的应用程序。

  • 指出他们可以研究的玩具样本以及使用F#的成功现实项目(Bing AdCenter,Halo 3等)。

  • 按照F#如何帮助他们更轻松地解决问题的方式解释一切。避免宗教辩论。对F#保持正面评价,而不对其他语言保持负面评价。用事实和证据武装他们,但让他们得出自己的结论。

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.