Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Type annotation

Tags:

f#

I am trying to solve the Project Euler #8. Here is my solution:

open System

let product_of_digits num =
    Seq.fold (fun acc elem -> acc * elem) 1 [for x in num -> int32(x) - 48]

let all_possible_strings number =
    [ for x in [0 .. number.Length - 2] -> number.Substring(x, 2) ]

let problem_8 number =
    Seq.max(
        Seq.map (fun x -> (product_of_digits x)) (all_possible_strings number)
        )

[<EntryPoint>]
let main(args : string[]) =    
    printfn "result = %d" (problem_8 "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450")
    0

All works fine in Fsi.exe, but when I am trying to compile the code I have got error:

D:\datahub\Dropbox\development\myprojects\project-euler\Problem_8\problem_8.fs(7,22): error FS0072: Lookup on object of
indeterminate type based on information prior to this program point. A type annotation may be needed prior to this progr
am point to constrain the type of the object. This may allow the lookup to be resolved.

D:\datahub\Dropbox\development\myprojects\project-euler\Problem_8\problem_8.fs(7,44): error FS0072: Lookup on object of
indeterminate type based on information prior to this program point. A type annotation may be needed prior to this progr
am point to constrain the type of the object. This may allow the lookup to be resolved.

How can I fix it?

like image 605
ceth Avatar asked Aug 05 '26 08:08

ceth


1 Answers

For further insight, the reason why the F# compiler is having difficulty inferring the type of number in all_possible_strings is because you are using .NET object oriented instance properties and methods on number, which don't give enough information about the type. However, you can swap out the property call number.Length for the F# function application String.length number which cascades so that now all functions and parameters will be fully inferred.

like image 62
Stephen Swensen Avatar answered Aug 07 '26 01:08

Stephen Swensen