我正和一位朋友讨论编程问题,朋友是函数式编程的倡导者。他提到你不需要使用if语句,但我似乎无法概念化你将如何实现
if (something):
do this;
else:
do something_else;
在功能范例中?
编辑:我的朋友特别提到有些情况下你不需要使用if表达式,即使你可以。例如:
if x is odd:
x + 1
else:
x / 2
有没有办法在不使用任何if语句或条件的情况下实现上述内容?
答案 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条件,可能会发生这种情况)。但是如果我们使用模式匹配来获取第一个元素,那么这是不可能的,因为匹配构造的语法确保我们只有x
和xs
如果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
),但a
和b
是表达式,可以评估某些常见类型;它们不是陈述 - 因此结果为a
或b
,具体取决于cond
。