代码之家  ›  专栏  ›  技术社区  ›  Tuomas Hietanen

非类型化无穷大

  •  3
  • Tuomas Hietanen  · 技术社区  · 15 年前

    我想知道为什么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不能表示无穷大。 at system.numerics.biginteger..ctor(双值) 地址:$fsi_.main@() 由于错误而停止


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

    let numbers n = Seq.initInfinite (fun i -> i+1) |> Seq.take(n)
    
    2 回复  |  直到 11 年前
        1
  •  8
  •   Kurt Schelfthout    15 年前

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

        2
  •  3
  •   Stephen Swensen    14 年前

    inline +

    let inline infiniteRange start skip = 
        seq {
            let n = ref start
            while true do
                yield n.contents
                n.contents <- n.contents + skip
        }
    
    //val inline infiniteRange :
    //   ^a ->  ^b -> seq< ^a>
    //    when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^a)