F-Sharp(F#)无类型无限

Tuo*_*nen 3 f# functional-programming infinite-loop infinity lazylist

我想知道为什么F-Sharp不支持无限.

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

let numbers n = [1 .. 1/0] |> Seq.take(n)
Run Code Online (Sandbox Code Playgroud)

- > System.DivideByZeroException:尝试除以零.

我可以用非常复杂的方式编写相同的功能:

let numbers n = 1 |> Seq.unfold (fun i -> Some (i, i + 1)) |> Seq.take(n)
Run Code Online (Sandbox Code Playgroud)

- >工作

但是我认为第一个会更清楚.我找不到在F#中使用动态类型无穷大的任何简单方法.有无限关键字,但它是浮点数:

let a = Math.bigint +infinity;;
Run Code Online (Sandbox Code Playgroud)

System.OverflowException:BigInteger不能表示无穷大.at System.Numerics.BigInteger..ctor(Double value)at.$ FSI_0045.main @()因错误而停止


编辑:这似乎也适用于迭代:

let numbers n = Seq.initInfinite (fun i -> i+1) |> Seq.take(n)
Run Code Online (Sandbox Code Playgroud)

Kur*_*out 8

首先,F#列表并不是懒惰的,(我不确定Ruby列表是否是懒惰的),所以即使使用无穷大的一般概念,你的第一个例子也无法工作.

其次,Int32中没有无穷大值.只有MaxValue.Double中有正负无穷大.

把它放在一起,这有效:

let numbers n = seq { 1. .. 1./0. } |> Seq.take(n)
Run Code Online (Sandbox Code Playgroud)

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

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

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