【发布时间】:2018-01-30 03:43:20
【问题描述】:
我正在浏览一篇名为 Why functional programming matters 的论文。它首先介绍如何计算列表中数字的总和。然后,该公式强调可以通过将列表中的数字与列表其余部分的 sum 函数相加来以递归方式计算该总和,并且将此过程称为reduce,然后写入reduce的定义可以通过参数化sum的定义来获得:
(reduce f x) nil = x
(reduce f x) (cons a l) = f a ((reduce f x ) l)
我想知道的是,我们在函数式编程的程序中实际上是这样写的还是这只是一个概念的说明?
同样是我的问题,它说明了另一个函数doubleaddcons,可以写成如下:
doubleall = reduce doubleandcons nil
在哪里doubleandcons num list = cons (2*num) list
它实际上是在程序中这样写的还是只是一个概念的说明?
【问题讨论】:
-
对于旨在纯函数式或几乎完全函数式的语言(OCAML、Haskell 等),编译器可以很好地优化像
reduce这样的原语的函数式表达式。在那些,是的,你做这样的程序。但是大多数具有功能特性的命令式语言(Python、Ruby、Java 8、Scala 等)都不会打扰。他们会给你一个库reduce实现,它在底层使用迭代。 -
不清楚是什么让你困惑,但如果是语法,引言说“我们正在遵循特纳的语言米兰达”。 Miranda 是 Haskell 的先驱。语法非常相似。如果您想知道是否有人真正使用像
reduce这样的高阶函数,答案是“一直”。 -
是的,这个特殊的例子说明了参数化模式的概念——在这种情况下,循环(或递归)在一个列表上。我们做了比这更奇怪的抽象:-)