Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 函数[x]->;是如何实现的。。。工作_F# - Fatal编程技术网

F# 函数[x]->;是如何实现的。。。工作

F# 函数[x]->;是如何实现的。。。工作,f#,F#,我在浏览FSharp.Data的源代码时遇到了这行代码 let (|Singleton|) = function [l] -> l | _ -> failwith "Parameter mismatch" 函数[l]是我不理解的。更具体地说,我不理解[l]参数是如何工作的 通过在FSI中的实验,我可以确定它启动了一种模式匹配形式,类似于match[l]with…。但是,我无法理解F#编译器如何解释表达式 我想知道的是它实际上是如何工作的,它遵循什么规则。它相当于 let (|Sin

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

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
。请参阅“列表模式”。

谢谢。这回答了我的问题。