我在F#
中注意到了以下写作功能的风格let reverse1 a =
a |> List.rev
let reverse2 = function
| _ as a -> a |> List.rev
你能解释一下它们的区别吗?
答案 0 :(得分:2)
他们都是一样的。
// 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
答案 1 :(得分:2)
关于“功能宣言的风格”(正如评论中所阐明的那样),原则上没有真正的区别。第二个定义只是一个捷径。
直接的第一个定义定义了一个函数。在您的示例中,它接受参数a
,将函数List.rev
应用于它,并返回结果。
第二个定义实际上是定义一个函数的快捷方式,该函数的主体只有一个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
。
这种表示法模仿了在数学中定义分段函数的方式。你可能在高中(或大学)数学课上看到过类似的东西:
abs(x) = x, x >= 0
-x, x < 0