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