gpt4 book ai didi

f# - 为什么 F# 推断我的函数实现了 IComparable?

转载 作者:行者123 更新时间:2023-12-01 09:34:44 25 4
gpt4 key购买 nike

我是一名业余程序员(职业厨师),目前正在尝试自学 F# 和一般的函数式编程。

反正我是在玩弄DeflateStream并写了以下两个函数:

let Compress compressMe =
let ds = new DeflateStream(File.Create("compressed.txt"), CompressionMode.Compress)
File.OpenRead(compressMe).CopyTo(ds)
ds.Close()

let Decompress =
let ds = new DeflateStream(File.OpenRead("compressed.txt"), CompressionMode.Decompress)
ds.CopyTo(File.Create("decompressed.txt"))
ds.Close()

在 main 函数的主体中,它们被一个接一个地调用,如下所示:

Compress args.[0]
Decompress

但是,如果程序运行时compressed.txt不存在Decompress抛出 FileNotFoundException这令人惊讶,因为唯一可能引发此问题的是对 File.OpenRead("compress.txt") 的调用。 .大约一个小时后,我发现 Decompress正在实现IComparable并且在主函数中调用它之前被执行。我发现通过将其定义更改为 let Decompress () = [...]它不再实现IComparable我的代码按预期执行。谁能告诉我为什么 F# 在推断 IComparable以及为什么这样的推理会导致函数在标有 [<EntryPoint>] 的主函数之前执行?另外,请原谅我代码的命令风格,我对此非常陌生。

提前致谢。

最佳答案

我不完全确定 IComparable 位,但您遇到的问题是,如果没有括号,编译器会将 Decompress 视为 value 而不是 < em>功能。这与你写的类似。

let compressedName = "compressed.txt"

在这种情况下,compressedName 现在是一个值。添加括号告诉编译器这是一个函数,每次调用该函数时都必须调用其代码,而不是由您编写的代码初始化一次(在入口点之前)的值。

关于f# - 为什么 F# 推断我的函数实现了 IComparable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369499/

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