Thursday, April 28, 2011

Why can't F# infer the type of this statement?

/// I can't do this
let max =  float n |> sqrt |> int64 |> Math.BigInt

/// But this is allowed
let max =  Math.BigInt(float n |> sqrt |> int64)
From stackoverflow
  • Class constructors cannot be used without arguments. You can write

    let max =  float n |> sqrt |> int64 |> (fun x -> Math.BigInt(x))
    

    if you like. (Offhand I don't know the reason for this restriction, though.)

    Unknown : Is int64 a class?
    Brian : No, in this context it's a function defined in http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Operators.html
    Unknown : Also can you tell me where to find the square root for a BigInt?
    Brian : There is no Sqrt function defined for BigInt in the library.
    Unknown : @Brian do you know if there will be one?
    Brian : No, I don't think one is planned for .Net 4.0's System.Numerics.BigInteger. You can always author your own.
  • In my version of F# (1.9.4.19 on Mono), both versions fail with:

    The member or object constructor 'BigInt' takes 0 argument(s) but is here given 1. The required signature is 'Math.BigInt()'.

    I can use

    let max =  float n |> sqrt |> int64 |> Math.BigInt.of_int64
    

    to get a bigint or

    let max =  float n |> sqrt |> int64 |> Math.BigInt.FromInt64
    

    to get a Math.BigInt.

0 comments:

Post a Comment