-3

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

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

视频讲座

一些文章

4

1 回答 1

2

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

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

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

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

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

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

map _ [] = []

我们完成了!现在,如果您可以从“如何”的角度思考并编写上述代码,那就继续吧(随着我获得更多经验,我倾向于更频繁地这样做)。但是,如果您发现自己陷入困境,那么根据“什么”来思考是一种有用的技巧。

于 2013-02-25T02:47:45.053 回答