2个函数有什么区别
What is difference between 2 functions
我注意到 F# 中函数的以下写法
let reverse1 a =
a |> List.rev
let reverse2 = function
| _ as a -> a |> List.rev
能否解释一下它们的区别?
都是一样的
// as normal function
let reverse1 a = a |> List.rev
let reverse2 a = List.rev a
let reverse3 = List.rev
// as pattern matching
let reverse4 = function | _ as a -> a |> List.rev // takes everything _ as a, and feeds a into List.rev
let reverse5 = function _ as a -> a |> List.rev
// as lambda function
let reverse6 = fun a -> a |> List.rev
关于"style of function declaration"(如评论中所澄清),原则上没有真正的区别。第二个定义只是一个快捷方式。
第一个定义直接定义了一个函数。在您的示例中,它接受参数 a
,对其应用函数 List.rev
,然后 returns 结果。
第二个定义实际上是定义主体只有一个 match
表达式的函数的捷径。
换句话说,如果你有一个主体由 match
表达式组成的函数,如下所示:
let f x =
match x with
| Blue a -> a + 5
| Green b -> b.SomeField
你可以这样写得短一点:
let f = function
| Blue a -> a + 5
| Green b -> b.SomeField
换句话说,= function
等同于 x = match x with
。
此表示法模仿您在数学中定义分段函数的方式。你可能在高中(或大学)数学课上见过这样的东西class:
abs(x) = x, x >= 0
-x, x < 0
我注意到 F# 中函数的以下写法
let reverse1 a =
a |> List.rev
let reverse2 = function
| _ as a -> a |> List.rev
能否解释一下它们的区别?
都是一样的
// as normal function
let reverse1 a = a |> List.rev
let reverse2 a = List.rev a
let reverse3 = List.rev
// as pattern matching
let reverse4 = function | _ as a -> a |> List.rev // takes everything _ as a, and feeds a into List.rev
let reverse5 = function _ as a -> a |> List.rev
// as lambda function
let reverse6 = fun a -> a |> List.rev
关于"style of function declaration"(如评论中所澄清),原则上没有真正的区别。第二个定义只是一个快捷方式。
第一个定义直接定义了一个函数。在您的示例中,它接受参数 a
,对其应用函数 List.rev
,然后 returns 结果。
第二个定义实际上是定义主体只有一个 match
表达式的函数的捷径。
换句话说,如果你有一个主体由 match
表达式组成的函数,如下所示:
let f x =
match x with
| Blue a -> a + 5
| Green b -> b.SomeField
你可以这样写得短一点:
let f = function
| Blue a -> a + 5
| Green b -> b.SomeField
换句话说,= function
等同于 x = match x with
。
此表示法模仿您在数学中定义分段函数的方式。你可能在高中(或大学)数学课上见过这样的东西class:
abs(x) = x, x >= 0
-x, x < 0