当我遇到这行代码时,我正在浏览FSharp.Data的源代码
let (|Singleton|) = function [l] -> l | _ -> failwith "Parameter mismatch"
function [l]
是我无法理解的。更具体地说,我不了解[l]
参数的工作原理。
通过在FSI中进行实验,我可以确定它开始一种类似于match [l] with ...
的模式匹配形式。但是,我无法弄清楚F#编译器如何解释表达式。
我想知道的是它实际上是如何运作的,以及它遵循的规则。
答案 0 :(得分:9)
相当于
let (|Singleton|) lst =
match lst with
| [l] -> l
| _ -> failwith "Parameter mismatch"
所以它从单个元素列表中提取元素,或者如果列表中有任何其他数量的元素,则抛出异常。
答案 1 :(得分:2)
请参阅pattern matching syntax上的文档。 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 foo x y z =
match z with
| CaseA -> x + y
| CaseB -> x - y
修改强>
(为了完整性)至于[l]
,就像李说的那样,这只是一种匹配模式。具体而言,列表上的结构匹配模式将列表与单个元素匹配,并将该元素绑定到标识符l
。请参阅"列表模式" here