F# 函数[x]->;是如何实现的。。。工作
我在浏览FSharp.Data的源代码时遇到了这行代码F# 函数[x]->;是如何实现的。。。工作,f#,F#,我在浏览FSharp.Data的源代码时遇到了这行代码 let (|Singleton|) = function [l] -> l | _ -> failwith "Parameter mismatch" 函数[l]是我不理解的。更具体地说,我不理解[l]参数是如何工作的 通过在FSI中的实验,我可以确定它启动了一种模式匹配形式,类似于match[l]with…。但是,我无法理解F#编译器如何解释表达式 我想知道的是它实际上是如何工作的,它遵循什么规则。它相当于 let (|Sin
let (|Singleton|) = function [l] -> l | _ -> failwith "Parameter mismatch"
函数[l]
是我不理解的。更具体地说,我不理解[l]
参数是如何工作的
通过在FSI中的实验,我可以确定它启动了一种模式匹配形式,类似于match[l]with…
。但是,我无法理解F#编译器如何解释表达式
我想知道的是它实际上是如何工作的,它遵循什么规则。它相当于
let (|Singleton|) lst =
match lst with
| [l] -> l
| _ -> failwith "Parameter mismatch"
let foo x y z =
match z with
| CaseA -> x + y
| CaseB -> x - y
因此,它从单个元素列表中提取元素,或者如果列表中有任何其他数量的元素,则抛出异常。请参阅上的文档function
是一种简写语法,用于获取单个参数并立即进行模式匹配:
let foo x =
match x with
| CaseA -> 1
| CaseB -> 2
相当于
let foo = function
| CaseA -> 1
| CaseB -> 2
请注意,function
只添加了一个参数,并不强制要求只有一个参数。例如,这是可以接受的:
let foo x y = function
| CaseA -> x + y
| CaseB -> x - y
相当于
let (|Singleton|) lst =
match lst with
| [l] -> l
| _ -> failwith "Parameter mismatch"
let foo x y z =
match z with
| CaseA -> x + y
| CaseB -> x - y
编辑:
(为了完整性)至于
[l]
,正如李所说,这只是一种匹配模式。具体地说,列表上的一种结构匹配模式,它将列表与单个元素相匹配,并将该元素绑定到标识符l
。请参阅“列表模式”。谢谢。这回答了我的问题。