两个功能有什么区别

时间:2015-10-29 20:21:36

标签: f# f#-interactive

我在F#

中注意到了以下写作功能的风格
let reverse1 a =
    a |> List.rev

let reverse2 = function
    | _ as a -> a |> List.rev

你能解释一下它们的区别吗?

2 个答案:

答案 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