scala 函数式编程_Scala函数式编程简介

scala 函数式编程

Scala旨在允许使用函数式编程风格。 但是Scala 函数式编程实际上是什么意思? 让我们从功能程序是不可变的事实开始。

不变的软件

例如,在常规编程中,将变量初始化为某个值:

x = 1
return x * 2

这将返回2.但是,当另一个程序员签出该代码并更改x的值时,程序的值可以更改。

使用函数式编程时,没有全局变量。 一切都是功能 。 因此输出始终是相同的。 换一种说法:

function (x) return x * 2

功能程序的编写类似于数学语句。 由于没有全局变量,因此所有内容都必须是一个函数。 并且由于所有内容都必须是一个函数,因此您需要检查它们是否已完全实现且未应用于无效输入。 例如,存在域,部分应用的功能和模式匹配的概念。 所有这些检查确保程序可以处理传递给程序的任何值而不会导致程序崩溃。

让我们看一下这些概念。

在数学中,函数的范围是该函数对其有效的值的范围。 例如,函数sqrt的域(平方根)为x> = 0,因为未定义负数的平方根(嗯,它们是负数。它们称为复数,即i)。

我们将函数f的域写为{f(x):x∈R,> = 0}。 这表示x的域是任何非负的实数。

我们可以使用部分函数在Scala中表达这一点。

在函数sr中 ,如果我们不使用PartialFunction一词,则编译器会抱怨我们没有处理所有值。

在下面,我们定义了一个接受Double并返回Double的函数。 我们检查输入是否大于或等于零。 如果是,则返回平方根。 sr.isDefinedAt()检查以确保我们要传递的值在函数的域中,即已被应用。

import java.lang.Math

val sr: PartialFunction[Double, Double] = {
  case d: Double if d >= 0 => Math.sqrt(d)
}


sr.isDefinedAt(-1)
res7: Boolean = false

高阶函数

高阶函数使您可以将复杂的函数分解为多个步骤。 如果您还记得大学时代的数学,这些称为复合函数:

那就是f(g(x)),它被解读为x的g中的f 。

例如,我们可以将语句2x – 2分为两个步骤:

g(x) = 2x
f(g(x)) = g(x) - 2

我们可以在Scala中做到这一点,因为在Scala函数式编程中,您可以将函数作为参数传递。 在下面的函数f中, g是返回Int的函数。

def g(x: Int): Int = { x * 2}
def f(g: Int=> Int, x: Int) : Int = {g(x) - 2}
Here is the result.
f(g,2)
res11: Int = 2

如何咖喱功能

咖喱函数意味着应用嵌套函数,而不是对集合中的每个项目应用相同的操作。 一个明显的候选人就是加法。

例如,要添加两个数字,您将编写:

def add1(x:Int, y:Int): Int = x + y

运行:

add1(2,3)
res15: Int = 5

但是现在我们编写了一个新函数,该函数接受一个I nt并返回一个函数,该函数返回另一个Int 。 当您运行该函数时,它将保存其值。 再次运行它,它将将该值添加到您第一次传递的值中。 所以x + y保持一个连续的总和:

def add2(x: Int):Int=>Int = y=> x + y

运行两次:

add2(1)(2)
res20: Int = 3

如果只运行一次,则更容易理解:

add2(2)
res16: Int => Int = <function1>

因此,我们可以多次调用此函数,以使其成为加法器。

递归函数

函数可以自行调用。 让我们计算n ! (n阶乘),即:

n * (n -1) * (n - 2) … For example, 3! = 3 * 2 * 1.

我们可以采取一种捷径并通过在本例中将3作为List(1,2,3)而不是3来编写函数,从而为Scala函数提供所需的每个值。

x :: tail表示程序从列表中取出第一个和最后一个元素。 遍历列表1,2,3中的每个项目,包括空列表Nil 。 并且由于所有函数都有值,因此该函数保持阶乘值的连续计数,这使其可以迭代或递归。

def factorial(ints: List[Int]): Int = ints match { 
  case Nil => 1
  case x :: tail => x * factorial(tail)
}

运行:

factorial(List(1,2,3))
res30: Int = 6

如果我们使用加法,则此Scala 代码更容易理解:

def sum(ints: List[Int]): Int = ints match { 
  case Nil => 0
  case x :: tail => x + sum(tail)
}

结果是:

sum(List(1,2,3))
res33: Int = 6

当然,还有很多东西要学习,但这是如何进行Scala函数式编程的简要介绍。

翻译自: https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Functional-Programming-with-Scala

scala 函数式编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值