Functional programming 学习函数式编程-概念化有困难;“无if语句”;

Functional programming 学习函数式编程-概念化有困难;“无if语句”;,functional-programming,Functional Programming,我和一个朋友讨论编程,他是函数式编程的倡导者。他提到不需要使用if语句,但我似乎无法概念化如何实现 if (something): do this; else: do something_else; 在功能范式中 编辑:我的朋友特别提到,在某些情况下,即使可以,也不需要使用if表达式。例如: if x is odd: x + 1 else: x / 2 有没有一种方法可以在不使用任何if语句或条件的情况下实现上述内容?如果没有更多的上下文,很难确切地知道您的

我和一个朋友讨论编程,他是函数式编程的倡导者。他提到不需要使用if语句,但我似乎无法概念化如何实现

if (something):
    do this;

else:
    do something_else;
在功能范式中

编辑:我的朋友特别提到,在某些情况下,即使可以,也不需要使用if表达式。例如:

if x is odd:
    x + 1
else:
    x / 2

有没有一种方法可以在不使用任何if语句或条件的情况下实现上述内容?

如果没有更多的上下文,很难确切地知道您的朋友的意思,但我想到了两件事,他可能有合理的意思:

在函数式语言中,
if
条件是表达式,而不是语句,因此您应该使用
if
表达式而不是
if
语句。这种差异意味着你写的东西如下:

let x =
  if condition
  then value1
  else value2
而不是:

let x be a mutable variable
if condition
then x = value1
else x = value2
因此,这允许您在不改变变量的情况下以函数样式编写


他可能的另一个意思是,许多函数式语言提供了模式匹配或保护之类的结构,您可以使用它们来代替
if
语句。模式匹配允许您检查值的结构,同时将其拆分。例如,您可以编写以下内容:

match my_list with
| x :: xs -> x + sum xs
| [] -> 0
与此相反:

if my_list is empty
then
  let x be the first element of my_list
  let xs be the list containing the remaining elements of my_list
  x + sum xs
使用模式匹配更可取,因为它可以避免对结构不支持的值调用函数。在上面的示例中,返回列表的第一个元素的函数在调用空列表时可能会导致错误(如果我们搞乱了if条件,可能会发生这种情况)。但是,如果我们使用模式匹配来获取第一个元素,那么这种情况就不会发生,因为匹配结构的语法确保我们只在
my_list
确实不是空的情况下获取
x
xs

模式保护允许您向模式匹配添加任意条件:

match f(x) with
| 0 -> "f(x) was zero"
| 1 -> "f(x) was one"
| x when x > 1 -> "f(x) was greater than one"
| _ -> "f(x) was negative"

如果您正在进行模式匹配,这可能会更干净,但这并不意味着您不应该在函数式语言中使用
if
表达式。如果您不想在某个值上进行模式匹配,那么引入模式匹配只是为了使用一个保护,与使用If语句相比没有什么意义。

让您困惑的不是
If
,而是“
do

在函数式编程中,您不会“做”任何事情。
您只需将结果定义为输入的某个函数

<>函数当然可以有条件(如:代码> COND,A: B</代码>,如C++语言、java语言、C++语言等),但是<代码> a < /> >和<代码> b>代码>是对一些常见类型进行评估的表达式;它们不是语句——因此结果是
a
b
,具体取决于
cond