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)
首先,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.
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |