我有以下内容:
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(float 5)”是编译器错误。
我需要做些什么才能让它发挥作用?
getDateTime是一个函数,我不能添加类型注释。
我很困惑为什么它没有拿起一个返回DateTime的函数,因此像AddDays这样的所有函数都可用
答案 0 :(得分: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