2015-10-18 63 views
1

我有以下幾點:類型標註要求

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

回答

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 

從這一點可以推斷,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