输入注释

dem*_*mas 2 f#

我正在努力解决Project Euler#8.这是我的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

所有在Fsi.exe中都可以正常工作,但是当我尝试编译代码时,我遇到了错误:

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.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Ste*_*sen 7

为了进一步了解,为什么F#编译器有困难推断类型的原因numberall_possible_strings,是因为你使用的是.NET面向对象实例的属性和方法number,不提供有关类型的足够信息.但是,您可以替换级联number.Length的F#函数应用程序的属性调用,String.length number以便现在可以完全推断出所有函数和参数.


Hne*_*efi 6

如错误所示,您需要为编译器提供有关函数参数类型的更多信息.如果我对行进行计数,看起来函数"problem_8"中的变量"number"是不确定类型的.要修复它,重新定义函数定义,如下所示(假设您希望"number"参数为字符串):

let problem_8 (number : string) =
Run Code Online (Sandbox Code Playgroud)