功能性知识的具体示例,允许您编写更好的命令式/ OO代码

时间:2014-03-27 08:52:36

标签: haskell functional-programming

我一直在使用函数式编程已经有一段时间了,我觉得它很棒,所以我想教一些朋友Haskell。

不幸的是,我无法想到任何特定的代码片段来展示它们并说“请看,这就是它看起来势在必行,看看功能有多好”

那么,那些比我更专业的人(这是一个非常低的要求)可以帮助我吗?

这似乎并不适合我,但如果是,请告诉我如何修复它。

4 个答案:

答案 0 :(得分:7)

可能最好的回归概念是所谓的"价值语义"和"纯度"。

这些中的每一个都很难相互影响,在实践中很难将它们分开。然而,原则上,值语义意味着每个"事物"应该像一个值而不是一个对象。它导致更简单的传球,更少的"远距离的怪异动作"来自有状​​态,它提供了一些背景来对代码进行等式推理。 纯度意味着在您拥有代码的任何地方都不会出现副作用,而只是在仔细划分的点上。这意味着您的大多数代码最终都是独立且可重复使用的,而只有核心"应用程序"比特纠结于状态和效果。

你可能会说纯度在任何地方都具有价值语义,或者价值是纯粹的计算 - 所以也许值得一提的是"价值观"请参考您系统的名词(静力学)和"纯度"动词(动态)。


众所周知,这些技术在其他语言中很有用。如今,在OO语言中,由于组织和正确性的好处,高兴地为价值语义牺牲了一些速度,这是一个常见的想法。如果您对Haskell感到满意,那么您将了解如果将价值语义和纯度应用于整个程序的每个方面而不妥协,它们将如何工作。这意味着你已经接触过一些强大的模式来推理和构建纯粹的程序。

我一直在考虑进行比较的地方是免费monad和Command模式之间。两者都解决了非常类似的问题 - "如何明确一个包含程序执行指令的结构,并在以后执行它,可能以各种方式执行?"但是命令模式倾向于如果不是命令本身,至少可以在翻译中跳舞。

我们可以编写更像Free monads的Command模式吗?有什么好处?如果你有强大的Haskell背景,那么你可以提出更多敏锐的问题。

答案 1 :(得分:6)

这是一个有趣且棘手的问题。一段时间以来,功能语言已成为命令式语言的概念趋势,功能/命令式语言之间的界限相当模糊。例如,假设您要对列表xs的每个元素进行平方并将结果存储在新列表ys中。

>> xs = [1, 2, 3]                   #  Python

>> xs = [1, 2, 3]                   -- Haskell

如果您不了解功能习语,可以这样做:

>> ys = [0] * len(xs)               #  Python
>> for i in range(len(xs)):
       ys[i] = xs[i] * xs[i]

在Haskell中你只需要写

>> ys = map (\x -> x * x) xs        -- Haskell

这个习惯用法也存在于Python中,当然

>> ys = map(lambda x: x * x, xs)    #  Python

可以说,更好的方法就是使用列表理解

>> ys = [x * x | x <- xs]           -- Haskell

也存在于Python

>> ys = [x * x for x in xs]         #  Python

当然,功能方式比命令式方式更好(并且更可组合,更可重用)。但在这种情况下,您不需要使用函数式语言来获得好处 - 您只需准备好“以功能性方式思考”。

答案 2 :(得分:2)

Monads和continuations。

我遇到过这样的代码:

synchronized(q) {
  Object o = q.poll();
  if (o == null) {
    ...// do something
  }
}

这已经折叠成一个更好的API重构:

Object o = q.poll(doSomethingAsLambda)

当然,q实现已被重写,但现在同步更精细,因为实现允许在q实现可能知道的分支“内部”执行自定义代码。

答案 3 :(得分:2)

现代函数式语言(如Haskell和ML)简洁明了 - 你可以在很多代码中说很多。

简洁的一个真正好处是你可以快速迭代设计,而在其他领域(如图形或时装设计),快速迭代似乎被认为是成为优秀或专业设计师的“工具”之一;因此,公平地相信学习如何快速迭代软件设计将有助于使您成为更好的程序员。

当然,像Python这样的现代脚本语言和Alloy(由麻省理工学院的Daniel Jackson开发)这样的“设计”语言都很简洁,可以让你快速迭代设计/原型。因此,更大的主题似乎是“轻量级”/简洁语言可以帮助您迭代和提高您的设计技能,而不仅仅是“函数式编程将使您成为更好的'主流'程序员”。