函数[x] - >如何? ......工作

时间:2014-04-19 15:25:01

标签: f#

当我遇到这行代码时,我正在浏览FSharp.Data的源代码

let (|Singleton|) = function [l] -> l | _ -> failwith "Parameter mismatch"

function [l]是我无法理解的。更具体地说,我不了解[l]参数的工作原理。

通过在FSI中进行实验,我可以确定它开始一种类似于match [l] with ...的模式匹配形式。但是,我无法弄清楚F#编译器如何解释表达式。

我想知道的是它实际上是如何运作的,以及它遵循的规则。

2 个答案:

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