gpt4 book ai didi

f# - 纯函数式编程

转载 作者:行者123 更新时间:2023-12-03 22:19:04 24 4
gpt4 key购买 nike

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

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

最佳答案

您提供的示例函数已经是纯函数式的。当我们谈论函数纯度时,我们实际上是在谈论函数的属性是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

关于f# - 纯函数式编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40851346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com