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

时间:2013-09-16 20:57:06

标签: functional-programming

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

if (something):
    do this;

else:
    do something_else;

在功能范例中?

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

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

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

2 个答案:

答案 0 :(得分:6)

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

在函数式语言中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条件,可能会发生这种情况)。但是如果我们使用模式匹配来获取第一个元素,那么这是不可能的,因为匹配构造的语法确保我们只有xxs如果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"

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

答案 1 :(得分:2)

应该让您感到困惑的部分不是if,而是“do”。

在函数式编程中,你不会“做”任何东西 您只需将定义结果作为输入的某些功能。

该函数当然可以具有条件(如C#,Java,C ++等语言中的cond ? a : b),但ab是表达式,可以评估某些常见类型;它们不是陈述 - 因此结果为ab,具体取决于cond