输入所需的注释

Noe*_*oel 1 f#

我有以下内容:

let GetDateTime() = System.DateTime.UtcNow


let InternalHandle dependencies =
    let getDateTime = dependencies

    let future = getDateTime()
    let future = getDateTime().AddDays(float 5)
    printf "The time is %A" future
    ()



let Handle() =
    let dependencies = (GetDateTime)

    InternalHandle dependencies


Handle();;
Run Code Online (Sandbox Code Playgroud)

但我的编译错误"getDateTime().AddDays(float 5)"关于类型注释.

我需要做些什么才能让它发挥作用?

getDateTime是一个函数,我不能添加类型注释.

我很困惑为什么它没有拿起它返回DateTime的函数,因此像AddDays这样的所有函数都可用

Tom*_*cek 5

在对函数进行类型推断时,F#编译器不会查看稍后如何调用该函数.这意味着在推断类型时InternalHandle,它只能看到:

let InternalHandle dependencies =
    let getDateTime = dependencies    
    let future = getDateTime()                   // (#1)
    let future = getDateTime().AddDays(float 5)  // (#2)
    printf "The time is %A" future
Run Code Online (Sandbox Code Playgroud)

从这里,它可以推断出这dependencies是一个函数(因为它在#1中被调用),但它不知道函数返回什么.当它到达(#2)时,它会看到你想AddDays在结果上调用方法 - 但这还不足以决定结果类型是什么(它可能是任何具有此方法的.NET对象......).因此,您需要一个类型注释来指定您期望的对象.你可以写:

let InternalHandle (dependencies : unit -> System.DateTime) =
    let getDateTime = dependencies    
    let future = getDateTime()
    let future = getDateTime().AddDays(float 5)
    printf "The time is %A" future
Run Code Online (Sandbox Code Playgroud)