函数式编程中究竟是什么'How to do and What to do'或'Focus on results, not steps'



我很难理解函数式编程中的"不要考虑如何做而是做什么"的概念(关注结果,而不是步骤(。假设我们有一种语言,它将函数视为一等公民,并且没有用于迭代的内置函数(例如 Scala 中的 forAll(。在这种情况下,我们首先必须创建一个函数来告诉如何迭代给定的数据结构,不是吗?因此,如果它本身的语言不能提供足够的功能,那么除了具有作为一等公民的功能之外,它与命令式编码几乎相同,不是吗?

如果我错了,请纠正我。以下是我提到的资源。

视频讲座

一些文章

">

如何"和"什么"是同一枚硬币的两面,有时以一种或另一种方式思考是有用的。思考"做什么"是思考递归的好方法,特别是对于没有太多编写递归函数经验的人来说。"如何"意味着一系列步骤,而"什么"意味着一系列定义。让我们考虑一下你的迭代示例(我将使用 Haskell,因为我不知道 Scala,但这些概念应该是可直接翻译的(。

Haskell的迭代函数被称为map,但假设我们想自己编写它。如果我们没有太多的递归经验,可能很难想象如何编写一个函数(map(将另一个函数(f(应用于列表的每个元素("映射"f list(。下面是我们想要的函数的类型签名:

map :: (a -> b) -> [a] -> [b]

因此,让我们尝试考虑应用于列表的每个元素的函数"是什么"。它是应用于第一个元素的函数,后跟映射到列表其余部分的函数。因此,让我们编写代码:

map f (firstElement:restOfList) = (f firstElement):(map f restOfList)

现在我们快完成了。剩下的唯一事情就是处理基本情况。如果列表为空怎么办?很明显,任何映射到空列表上的函数都是空列表,因此我们将编写代码:

map _ [] = []

我们完成了!现在,如果您可以考虑"如何"并编写上面的代码,请继续(因为我获得了更多的经验,我倾向于更频繁地这样做(。然而,如果你发现自己陷入困境,从"什么"的角度思考是一种有用的技巧。

最新更新