f# - 无法理解函数体内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
再次以不同的方式摧毁了我的大脑。以上两个片段有什么区别?而且,关于可变值的初始化,上面这句话的真正含义和条件是什么?
解决方案
你的第二个例子
let count =
let mutable a = 1
a <- a + 1
a
定义一个初始化为 1 的可变变量,然后使用<-
运算符为其分配一个新值 (a + 1),然后在最后一行返回更新后的值。由于a
has 类型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
。
推荐阅读
- c# - 在 C# 中是否可以检查给定的日期格式字符串是否仅包含日期格式或时间格式?
- nginx - Nginx域解析502网关
- user-interface - 无法为 Pact 代理启动 UI
- javascript - Nodejs通过超时5秒杀死了Sharp进程
- azure-devops - 使用 azure dev ops 将应用程序部署到本地环境
- user-interface - 我现在安装了 Visual Studio 2019,问题是我没有在 Visual C++ 中获得 UI 或 Windows 表单选项
- javascript - Discord.js UnhandledPromiseRejectionWarning:DiscordAPIError:无法发送空消息
- html - CSS - 斜线与空格的空白控制
- rest - 修改kotlin中Swagger Codegen方法的contentHeaders
- reactjs - 无法在 setState 上将隐藏列状态从 true 更改为 false