纯函数式编程

     2023-02-16     180

关键词:

【中文标题】纯函数式编程【英文标题】:Purely Functional Programming 【发布时间】:2016-11-28 18:46:51 【问题描述】:

所以,我是一位经验丰富的 OOP 程序员(主要是 C++),现在刚刚开始涉足函数式编程。据我了解,在纯函数范式中,函数不应该有条件,应该尽可能使用柯里化来分解。有人可以为我提供以下示例的“纯”功能版本吗?最好使用将成为功能范式一部分的所有严格技术:

let rec greatestCommonFactor a b =
    if a = 0 then b
    elif a < b then greatestCommonFactor a (b - a)
    else greatestCommonFactor (a - b) b

【问题讨论】:

欢迎来到 Stack Overflow!恭喜你在提问之前清楚地阅读了Help Center:这是一个很好的第一个问题。清晰,简洁,精确地包含必要的细节,没有一堆多余的废话。如果可以的话,我会支持你的问题 5 次。干得好! 【参考方案1】:

您提供的示例函数已经是纯函数式的。当我们谈论函数纯度时,我们实际上是在谈论函数的属性是referentially transparent

如果一个表达式可以用它的值替换而不改变程序的效果,那么它就是引用透明的。举个简单的例子,想象一下这个函数:

let add2 x = x + 2

现在,只要值 add2 2 出现在我们的程序中,我们就可以替换值 4 而不会改变程序的行为。

现在想象一下,我们在打印到控制台的函数中添加了一些额外的行为:

let add2Print x =
    printfn "%d" x
    x + 2

虽然函数的结果和以前一样,但我们不能再在不改变程序行为的情况下用值4 执行值替换,因为我们的函数具有打印到控制台的额外副作用。

这个函数不再是引用透明的,因此不是一个纯函数。


let rec greatestCommonFactor a b =
    if a = 0 then b
    elif a < b then greatestCommonFactor a (b - a)
    else greatestCommonFactor (a - b) b

看看你提供的这个函数,它的执行没有任何副作用。对于给定的输入ab,我们将始终得到相同的输出值,因此这已经是一个纯函数了。

需要明确的是,在函数式编程中包含条件的函数绝对没有问题。但是,我们通常使用模式匹配而不是 if/elif/else 表达式,但在您描述的示例中,这纯粹是风格上的。使用模式匹配的函数的替代表达式是:

let rec greatestCommonFactor a b =
    match a with
    |0 -> b
    |a' when a' < b -> greatestCommonFactor a' (b - a')
    |a' -> greatestCommonFactor (a' - b) b

【讨论】:

所以条件无关紧要?我的印象是在功能范式中优先考虑消除条件。比如使用 lambdas 代替它们。 @Zach 一些函数式语言倾向于简洁的风格,但条件仍然存在。甚至 Haskell 也有 if 关键字,不过,就像在 F# 中一样,您更倾向于使用模式匹配而不是 ifthen @Zach 不,条件绝对不重要。函数式编程中的条件通常是通过模式匹配而不是通过 if/elif/else 表达式来处理的,但在您在这里介绍的情况下,它纯粹是风格。 非常感谢你们两位的澄清。 @Zach 我还没有看到这里提到的是,在函数式语言中我们通常有 if 表达式,即 if 和 else(甚至 else-if)分支 必须 在每个分支上返回相同的类型。这是使引用透明性成为可能的限制。

scala之函数式编程根本概念-纯函数

什么是纯函数纯函数是函数式编程中的一个根本概念.纯函数要求一个函数输入对应输出,没有其它任何副作用,且引用透明.过程:没有返回值,只有副作用的函数一个纯函数有以下要求:没有副作用不向控制台打印不向文件写入数据... 查看详情

函数式编程

在函数式编程中,函数被视为一等公民,这意味着它们可以绑定到名称(包括本地标识符),作为参数传递,并从其他函数返回,就像任何其他数据类型一样。这允许以声明性和可组合的风格编写程序,其中小功能以模块化方式... 查看详情

前端学习之函数式编程—纯函数(代码片段)

Part01纯函数概念纯函数:相同的输入永远会得到相同的输出,而且没有任何可观察的副作用纯函数就类似数学中的函数,用来描述输入与输出之间的关系,例如:y=f(x)Part02案例:slice和splice函数 数组的slice和splice分别是纯函数和不纯... 查看详情

swift函数式编程八(纯函数式数据结构)(代码片段)

代码地址纯函数式数据结构(PurelyFunctionalDataStructures)指的是那些具有不变性的高效的数据结构。二叉搜索树使用indirect关键字将二叉树定义为一个递归枚举:indirectenumBinarySearchTree<Element:Equatable>caseleafcasenode(BinarySearchTree<... 查看详情

swift函数式编程八(纯函数式数据结构)(代码片段)

代码地址纯函数式数据结构(PurelyFunctionalDataStructures)指的是那些具有不变性的高效的数据结构。二叉搜索树使用indirect关键字将二叉树定义为一个递归枚举:indirectenumBinarySearchTree<Element:Equatable>caseleafcasenode(BinarySearchTree<... 查看详情

frege-基于jvm的类haskell纯函数式编程语言

Frege是一门受Haskell语言启示而设计的纯函数式编程语言。Frege程序会被编译为Java,并执行于JVM上。它与Haskell是如此的类似。以至于有人称它为JVM上的Haskell。取Frege这个名字是为了纪念德国数学家、逻辑学家、哲学家GottlobFrege。... 查看详情

什么是函数式编程(副作用纯函数引用透明)

    副作用的概念:一个带有副作用的函数不仅只是简单的返回一个值,还干了一些其他的事情,比如:修改一个变量直接修改数据结构设置一个对象的成员抛出一个异常或以一个错误终止打印到终端或读取用户的输入读取... 查看详情

(纯)函数式编程与“算法经典”是对立的吗?

】(纯)函数式编程与“算法经典”是对立的吗?【英文标题】:Is(pure)functionalprogrammingantagonisticwith"algorithmclassics"?【发布时间】:2011-10-1710:06:38【问题描述】:经典算法书籍(TAOCP、CLR)(而不是那么经典的书籍,例如f... 查看详情

函数式编程:纯函数&柯里化&组合函数(代码片段)

函数式编程:纯函数&柯里化&组合函数纯函数函数的柯里化组合函数纯函数相同的输入值,产生相同的输出在函数的执行过程中,不能产生副作用。不能对传入的参数进行修改,不依赖上层作用域内的数据。... 查看详情

01函数式编程概念

FunctionalProgramingFP函数式编程中的函数不是指程序中的函数,而是指数学中的映射关系Y=fn(X).同一个X始终对应同一个Y。是对运算过程中进行抽象。相同的输入始终得到相同输出。 纯函数的好处可以缓存纯函数的结果。相同输... 查看详情

玩转javascript面试:何为函数式编程?(代码片段)

函数式编程在JavaScript领域着实已经成为一个热门话题。就在几年前,很多JavaScript程序员甚至都不知道啥是函数式编程,但是就在近三年里我看到过的每一个大型应用的代码库中都包含了函数式编程思想的大规模使用。函数式编... 查看详情

函数式编程

函数式编程(英语:functionalprogramming)或称函数程序设计、泛函编程,是一种编程范式,它将计算机运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算(lambdacalculus)为该语言最重要的基础。而且,&lamb... 查看详情

函数式编程

  函数是编程就是用计算机函数取模拟数学里面的函数,如下:#数学函数:y=2*x+1#函数式编程:deftest(x):return2*x+1test(x)  函数式编程lisp就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,模拟数... 查看详情

什么是函数式编程?(代码片段)

 纯函数:定义:对于相同的输入永远会得到相同的输出,而且没有任何可以观察的副作用,也不依赖外部的环境状态。 例如数学公式:y=f(x)在javascript中,对于数组的操作,有的是纯的,有的是不存的,如:letarr=[1,2,3,4,5... 查看详情

swift函数式编程八(纯函数式数据结构)(代码片段)

代码地址纯函数式数据结构(PurelyFunctionalDataStructures)指的是那些具有不变性的高效的数据结构。二叉搜索树使用indirect关键字将二叉树定义为一个递归枚举:indirectenumBinarySearchTree<Element:Equatable>caseleafcasenode(BinarySearchTree<... 查看详情

函数式编程语言

 1、什么是函数式编程语言?  函数式编程语言(functionalprogramming language)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语... 查看详情

函数式编程--为什么要学习函数式编程?(代码片段)

函数式编程(FunctionalProgramming,FP)什么是函数式编程?通过纯函数来实现一些细粒度的函数,然后把这些细粒度的函数组合成功能更强大的函数,这一过程就是函数式编程,经典函数式编程库:lodash函数式编程是编程范式之一,... 查看详情

编程范式——函数式编程入门(代码片段)

该系列会有3篇文章,分别介绍什么是函数式编程、剖析函数式编程库、以及函数式编程在React中的应用,欢迎关注我的blog命令式编程和声明式编程拿泡茶这个事例进行区分命令式编程和声明式编程命令式编程1.烧开水(为第一人... 查看详情