4

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

if (something):
    do this;

else:
    do something_else;

在功能范式中?

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

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

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

4

2 回答 2

6

如果没有更多上下文,很难确切地知道您的朋友的意思,但有两件事浮现在脑海中,他本可以合理地表达:

在函数式语言if中,条件是表达式,而不是语句,因此您将使用if 表达式而不是if statements。这种差异意味着您可以编写如下内容:

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 条件,可能会发生这种情况)。但是如果我们使用模式匹配来获取第一个元素,这不会发生,因为匹配构造的语法确保我们只获取x并且xsifmy_list真的不为空。

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

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 语句相比没有什么意义。

于 2013-09-16T21:03:06.450 回答
2

应该让你感到困惑的部分不是if,而是 " do"。

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

该函数当然可能有条件(如cond ? a : b在 C#、Java、C++ 等语言中),但ab是计算某些常见类型的表达式;它们不是语句 - 所以结果是aor b,取决于cond.

于 2013-09-16T21:03:15.997 回答