F# 两个函数之间的区别是什么

F# 两个函数之间的区别是什么,f#,f#-interactive,F#,F# Interactive,我注意到F中的以下写作风格# 你能解释一下它们的区别吗?它们都是一样的 // 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 everythin

我注意到F中的以下写作风格#

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

它们都是一样的

// 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                
他们都一样

// 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                
关于“功能声明的风格”(如评论中所阐明的),原则上没有真正的区别。第二个定义只是一条捷径

第一个定义直接定义了一个函数。在您的示例中,它接受参数
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
你可以写得短一点,像这样:

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
abs(x)=x,x>=0 -x、 x<0 关于“函数声明的样式”(如注释中所述),原则上没有真正的区别。第二个定义只是一条捷径

第一个定义直接定义了一个函数。在您的示例中,它接受参数
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
你可以写得短一点,像这样:

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
abs(x)=x,x>=0 -x、 x<0
一个反转列表,另一个接受参数,忽略它,并为
list.rev
返回函数值。苹果和马,甚至不是苹果和桔子。忽略上述函数中的实现,这只是为了在F#中显示函数声明的样式。更精确的问题是声明样式的区别是什么,在什么情况下每种样式都是有用的?我更新了这个问题。这就是你想问的吗?是的,谢谢你的更新。@gradbot为什么
\uuu作为一个
(而不仅仅是
a
)?一个反转一个列表,另一个接受一个参数,忽略它,并为
list.rev
返回一个函数值。苹果和马,甚至不是苹果和桔子。忽略上述函数中的实现,这只是为了在F#中显示函数声明的样式。更精确的问题是声明样式的区别是什么,在什么情况下每种样式都是有用的?我更新了这个问题。这就是你想问的吗?是的,谢谢你的更新。@gradbot为什么
\u作为一个
(而不仅仅是
a
)?