f#:使用".. in let ..."的示例中的奇怪语法

Phi*_*ens 1 f# rosetta-code

我正在阅读关于RosettaCode的示例,并且不完全知道以下行正在做什么.

let min,subheap = findMin heap' in let rtn = root topnode
Run Code Online (Sandbox Code Playgroud)

它似乎findMin heap'是自包含的执行单元.我不知道它与"in"运算符的关系,也不了解在"in"运算符中使用let语句.

这是整个方法

let rec private findMin heap =
  match heap with | [] -> raise Empty_Heap //guarded so should never happen
                  | [node] -> root node,[]
                  | topnode::heap' ->
                    let min,subheap = findMin heap' in let rtn = root topnode
                    match subheap with
                      | [] -> if rtn.k > min.k then min,[] else rtn,[]
                      | minnode::heap'' ->
                        let rmn = root minnode
                        if rtn.k <= rmn.k then rtn,heap
                        else rmn,minnode::topnode::heap''
Run Code Online (Sandbox Code Playgroud)

[编辑]即使在sepp2k解释之后,"let"的文档也没有解释这一点.您必须查看"详细语法(F#)"文档.

sep*_*p2k 5

let表达式的详细语法是let <ident> = <exp> in <exp>.所以要定义和添加两个你可以编写的变量let x = 23 in let y = 42 in x + y.F#的轻量级语法允许您省略in一行的末尾,因此该示例将被写为:

let x = 23
let y = 42
x + y
Run Code Online (Sandbox Code Playgroud)

您的代码混合了详细和轻量级语法,通过保持第一个in能够将两个lets放在一行中.