gpt4 book ai didi

f# - 为什么 f# 会在没有警告或错误的情况下改变不可变变量?

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

以下脚本在没有错误或警告的情况下改变不可变变量 jar。这是一个错误吗?还是我的理解有问题?

请解释为什么我不需要使用 mutable 关键字。

旁白:FSharp.Data.Http.RequestString 的 cookieContainer 参数在定义中未标记为可变:https://github.com/fsprojects/FSharp.Data/blob/134a08cda3acb8e746bb25d03692d90ee5caabab/src/Net/Http.fs

#r "System.Xml.Linq.dll";;
#r "nuget:FSharp.Data";;

open FSharp.Data

let url="http://www.google.com"
let uri=System.Uri(url)

// no mutable keyword here
let jar=System.Net.CookieContainer()

// Count is 0
printf $"Pre-request cookie count is: {jar.GetCookies(uri).Count}\n"

let r = Http.RequestString(url, cookieContainer=jar)

// Count is 1
printf $"Post-request cookie count is: {jar.GetCookies(uri).Count}\n"

#r "System.Xml.Linq.dll";;#r "nuget:FSharp.Data";;

最佳答案

在 F# 中有两个与突变相关的不同概念:

  • 可变变量,即可以改变值的变量。它们是使用 let mutable 定义的然后使用 <- 更改值(如果变量不可变,这是不可能的)。

  • 可变对象,它们只是具有一些可变状态的 .NET 对象,可以通过调用对象上的方法来更改这些状态​​。这些是普通 C# 样式类的实例。

如果您定义一个不可变变量,它是对可变对象 的引用,该对象仍然可以被改变。变量不可变的事实并不能阻止这种情况的发生。这就是您的情况。

就像有不可变的变量一样,也有不可变的对象(或值)。这包括 F# 数据类型,如记录和可区分联合。但是,对象是否可变这一事实并没有在语言中进行跟踪 - 所以这是您无法以任何明显的方式看到的东西。

在精心设计的 F# 代码中,您自己的大部分对象都是不可变的,但您使用的大多数 .NET 对象(以访问 .NET 提供的功能)都是可变的 - 因为 .NET 就是这样设计的.

关于f# - 为什么 f# 会在没有警告或错误的情况下改变不可变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70863690/

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