我正在学习 F# 并被mutable关键字的概念所困扰。
请看下面的例子:
let count =
let mutable a = 1
fun () -> a <- a + 1; a
val count: unit -> int
Run Code Online (Sandbox Code Playgroud)
每次使用(). 但下一个代码没有:
let count =
let mutable a = 1
a <- a + 1
a
val count: int
Run Code Online (Sandbox Code Playgroud)
这总是2.
在我正在研究的书中,它用第一个例子说,“可变值的初始化a只在函数第一次调用时完成一次。”
当我开始用 haskell 学习 FP 时,它处理这种副作用的方式完全烧毁了我的大脑,但 F#mutable再次以不同的方式摧毁了我的大脑。以上两个片段有什么区别?还有,上面那句关于可变值初始化的真正含义和条件是什么?
你的第二个例子
let count =
let mutable a = 1
a <- a + 1
a
Run Code Online (Sandbox Code Playgroud)
定义一个初始化为 1 的可变变量,然后<-在最后一行返回更新的值之前使用运算符为其分配一个新值 (a + 1) 。由于ahas typeint并且 this 是从函数返回的,因此函数的返回类型也是int.
第一个例子
let count =
let mutable a = 1
fun () -> a <- a + 1; a
Run Code Online (Sandbox Code Playgroud)
还声明了int一个初始化为 1的a。然而,它不是直接返回它,而是返回一个关闭的函数a。每次调用此函数时,a 都会递增并返回更新后的值。它可以等价地写为:
let count =
let mutable a = 1
let update () =
a <- a + 1
a
update
Run Code Online (Sandbox Code Playgroud)
fun () -> ...定义一个lambda 表达式。此版本返回一个 1 参数函数,反映在 的不同返回类型中unit -> int。