首页 > 解决方案 > 无法理解函数体内F#可变变量的逻辑

问题描述

我正在学习 F# 并被mutable关键字的概念所困扰。

请看下面的例子:

let count =
    let mutable a = 1
    fun () -> a <- a + 1; a

val count: unit -> int

每次调用时都会增加 1 ()。但是下一个代码没有:

let count =
    let mutable a = 1
    a <- a + 1
    a

val count: int

总是2

在我正在学习的书中,第一个例子说,“a当函数第一次调用时,可变值的初始化只进行一次。”

当我开始用 haskell 学习 FP 时,它处理这样的副作用的方式完全烧毁了我的大脑,但 F#mutable再次以不同的方式摧毁了我的大脑。以上两个片段有什么区别?而且,关于可变值的初始化,上面这句话的真正含义和条件是什么?

标签: f#

解决方案


你的第二个例子

let count =
    let mutable a = 1
    a <- a + 1
    a

定义一个初始化为 1 的可变变量,然后使用<-运算符为其分配一个新值 (a + 1),然后在最后一行返回更新后的值。由于ahas 类型int并且 this 是从函数返回的,因此函数的返回类型也是int.

第一个例子

let count =
    let mutable a = 1
    fun () -> a <- a + 1; a

还声明了int一个初始化为 1 的 a。但是,它不是直接返回它,而是返回一个关闭的函数a。每次调用此函数时,都会增加 a 并返回更新后的值。它可以等效地写为:

let count =
    let mutable a = 1
    let update () =
        a <- a + 1
        a
    update

fun () -> ...定义一个lambda 表达式。此版本返回一个 1 参数函数,反映在不同的返回类型中unit -> int


推荐阅读