Desugared形式的"让步"

ebb*_*ebb 4 f# functional-programming

let (x = 0) in x * x翻译到底是什么?一个功能(fun x -> x * x) 0)?- 这是有道理的,因为let绑定是表达式 - 而表达式必须返回值(就像函数一样).

例:

let result1 = 
    (fun n1 -> (fun n2 -> 
    (fun n3 -> n1 + n2 + n3 ) 3) 2) 1

let result2 = 
    let n1 = 1 in
    let n2 = 2 in
    let n3 = 3 in
    n1 + n2 + n3

let result3 = 
    let n1 = 1
    let n2 = 2
    let n3 = 3
    n1 + n2 + n3
Run Code Online (Sandbox Code Playgroud)

我是否正确地认为这result3是一种含糖形式result2result2含糖形式result1

简:let in绑定是否转化为功能?

Tom*_*cek 11

你几乎可以把它let x = e1 in e2视为一种语法糖(fun x -> e2) e1.

在基本级别,这两个表达式意味着相同的事情 - 编译器可能会以不同的方式编译它们(取决于优化级别以及它如何内联),但您通常可以使用第二种表示法而不是第一种表示法.

它们不同的一种情况是ML语言(包括F#)仅概括使用let关键字显式编写的函数类型.这意味着如果您使用fun,语言将不会将其视为通用函数.如果你想要一个泛型函数,你必须使用let(这不仅仅是一个编译器工件,这实际上是语言的一部分).

例如,以下用途let,它的工作原理:

let id = (fun x -> x) in ignore(id 1); ignore(id "A")
Run Code Online (Sandbox Code Playgroud)

但是以下方法不起作用,因为id它不是通用函数:

(fun id -> ignore(id 1); ignore(id "A")) (fun x -> x)
Run Code Online (Sandbox Code Playgroud)