类型标注要求

问题描述:

我有以下几点:类型标注要求

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();; 

,但我与 “getDateTime()AddDays(浮动5)” 关于类型的注释编译器错误。

我需要做些什么才能使其发挥作用?

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

我困惑,为什么不拿起它返回datetime,因而相同AddDays所有功能将能够使用的功能

+0

当然你可以注释函数。问题是为什么你需要'float 5?'或返回类型? –

+0

当我添加“AddDays”它不会complie – Noel

+0

,如果我做getDateTime:DateTime我得到错误此表达式预计有类型 日期时间 但这里有类型 单位 - > DateTime – Noel

在做的功能类型推断,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 

从这一点可以推断,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