x * x) 0) ? - 这是有道理的,如 let绑定(bind)是表达式 - 表达式必须返回值(就像函数一样)。-6ren">
gpt4 book ai didi

f# - "let in"的脱糖形式

转载 作者:行者123 更新时间:2023-12-04 21:52:12 25 4
gpt4 key购买 nike

let (x = 0) in x * x 做什么翻译成?一个函数(fun x -> x * x) 0) ? - 这是有道理的,如 let绑定(bind)是表达式 - 表达式必须返回值(就像函数一样)。

例子:

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

我是否正确地假设 result3result2 的加糖形式, 和 result2 result1 的糖化形式?

短:做 let in绑定(bind)转换为函数?

最佳答案

你几乎可以看到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")

但是以下不起作用,因为 id不是通用函数:
(fun id -> ignore(id 1); ignore(id "A")) (fun x -> x)

关于f# - "let in"的脱糖形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25249332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com