gpt4 book ai didi

f# - F-Sharp (F#) 无类型无穷大

转载 作者:行者123 更新时间:2023-12-01 08:20:19 30 4
gpt4 key购买 nike

我想知道为什么 F-Sharp 不支持无穷大。

这适用于 Ruby(但不适用于 f#):

let numbers n = [1 .. 1/0] |> Seq.take(n)

-> System.DivideByZeroException: 试图除以零。

我可以用非常复杂的方式编写相同的功能:
let numbers n = 1 |> Seq.unfold (fun i -> Some (i, i + 1)) |> Seq.take(n)

-> 作品

但是我认为第一个会更清楚。
我找不到在 F# 中使用动态类型无穷大的任何简单方法。
有 infinity 关键字但它是 float 的:
let a = Math.bigint +infinity;;

System.OverflowException:BigInteger 不能表示无穷大。
在 System.Numerics.BigInteger..ctor(双值)
在 .$FSI_0045.main@()
由于错误而停止

编辑:这似乎也适用于迭代:
let numbers n = Seq.initInfinite (fun i -> i+1) |> Seq.take(n)

最佳答案

首先,F# 列表不是惰性的(我不确定 Ruby 列表是否惰性),因此即使具有无穷大的一般概念,您的第一个示例也永远无法工作。

其次,Int32 中没有无穷大值。只有最大值。但是,Double 中存在正无穷大和负无穷大。

把它放在一起,这有效:

let numbers n = seq { 1. .. 1./0. } |> Seq.take(n)

不过我觉得 Seq.initInfinite 是你最好的选择。上面的代码对我来说看起来很奇怪。 (或者至少使用 Double.PositiveInfinity 而不是 1./0。)

乍一看,语言中的一个不错的选择是像haskell 中的无限范围运算符:seq { 1.. } 问题是它只适用于seq,所以我想支持后缀运算符的额外工作是仅凭此功能不值得。

底线:在我看来,使用 Seq.initInfinite。

关于f# - F-Sharp (F#) 无类型无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1558806/

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