【问题标题】:Can't understand the logic of F# mutable variable inside function body无法理解函数体内F#可变变量的逻辑
【发布时间】:2020-04-08 22:54:59
【问题描述】:

我正在学习 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 再次以不同的方式摧毁了我的大脑。以上两个sn-ps有什么区别?还有,关于可变值的初始化,上面这句话的真正含义和条件是什么?

【问题讨论】:

    标签: f#


    【解决方案1】:

    你的第二个例子

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

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

    第一个例子

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

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

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

    fun () -&gt; ... 定义了一个lambda expression。此版本返回一个 1 参数函数,反映在 unit -&gt; int 的不同返回类型中。

    【讨论】:

    • 那为什么在第一个例子中a的初始化只调用了一次呢?它与预计算有关吗?据我了解,多次调用第一个会导致每次初始化,这将使返回值始终为2
    • @MyBug18 - a 在两个示例中仅初始化一次,因为 count 仅评估一次。没有看到你所指的书很难说,但这种行为对于可变变量来说并不特殊。例如,您可以看到它:let count = printfn "initialising"; 1
    【解决方案2】:

    count 的第一个示例初始化一个可变变量,并返回一个围绕该变量的闭包。每次调用该闭包时,变量都会增加,并返回其新值。

    count 的第二个例子只是一个初始化块,它设置变量,增加一次,然后返回它的值。再次引用count 只会再次返回已经计算的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2021-01-19
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多