学习函数式编程 - 在概念化"no if statements"时遇到困难

Jon*_*tin 3 functional-programming

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

if (something):
    do this;

else:
    do something_else;
Run Code Online (Sandbox Code Playgroud)

在一个功能范例?

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

if x is odd:
    x + 1
else:
    x / 2
Run Code Online (Sandbox Code Playgroud)

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

sep*_*p2k 6

如果没有更多的背景知识,很难确切地知道你的朋友的意思,但有两件事可以理解为他可以合理地指出:

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

let x =
  if condition
  then value1
  else value2
Run Code Online (Sandbox Code Playgroud)

代替:

let x be a mutable variable
if condition
then x = value1
else x = value2
Run Code Online (Sandbox Code Playgroud)

因此,这允许您在不改变变量的情况下以函数式编写.


他可能意味着另一件事是许多函数式语言提供了模式匹配或保护等结构,您可以使用它们而不是if语句.模式匹配允许您检查值的结构并同时将其拆分.作为一个例子,你可以这样写:

match my_list with
| x :: xs -> x + sum xs
| [] -> 0
Run Code Online (Sandbox Code Playgroud)

而不是这个:

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
Run Code Online (Sandbox Code Playgroud)

使用模式匹配是首选,因为它避免了对结构不支持它的值调用函数.在上面的示例中,返回列表的第一个元素的函数可能会在空列表上调用时导致错误(如果我们搞乱if条件,可能会发生这种情况).但是如果我们使用模式匹配来获取第一个元素,则不会发生这种情况,因为匹配构造的语法确保我们只获得x并且xsif my_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"
Run Code Online (Sandbox Code Playgroud)

如果你进行模式匹配,这可以更清晰,但这并不意味着你不应该if在函数式语言中使用表达式.如果你没有想要在某个值上进行模式匹配的情况,那么引入模式匹配只是为了让你可以使用一个后卫对于使用if语句没有多大意义.