我正在和一个朋友讨论编程,他是函数式编程的倡导者。他提到您不需要使用 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
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
并且xs
ifmy_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 语句相比没有什么意义。
应该让你感到困惑的部分不是if
,而是 " do
"。
在函数式编程中,您不会“做”任何事情。
您只需将结果定义为输入的某个函数。
该函数当然可能有条件(如cond ? a : b
在 C#、Java、C++ 等语言中),但a
和b
是计算某些常见类型的表达式;它们不是语句 - 所以结果是a
or b
,取决于cond
.