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是一种含糖形式result2和result2含糖形式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)