2011-03-13 52 views
2

我現在正在試圖做一個非常簡單的應用程序,將迎接一天的時間。我的代碼是:F# - 破「然後」

open System 

let read() = Console.Read() 
let readLine() = Console.ReadLine() 

let clockMsg min max todo = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo 

let name = readLine() 

clockMsg 0 8 <| printfn "Go to bed, %s!" name 
clockMsg 8 12 <| printfn "Good morning, %s!" name 
clockMsg 12 18 <| printfn "Good afternoon, %s!" name 

read() |> ignore 

現在是我的問題,只是函數調用的一個人怎麼可以是有效的,但所有這三個會,無論怎樣,打印他們的消息?

回答

6

同意BrokenGlass。你可能想要做的是:

clockMsg 0 8 (fun() -> printfn "Go to bed, %s!" name) 

而這種改變在clockMsg

let clockMsg min max todo = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo() 
4
clockMsg 0 8 <| printfn "Go to bed, %s!" name 

這傳遞結果printfn功能clockMsg功能 - 因此它被評爲clockMsg運行之前,你看這是所有消息的原因。

此外,由於它沒有返回值(或unit類型的更具體的結果()),您將在todo總是以null通過調試器看到的。

1

只提到另一種方法:你可以通過懶< _>作爲參數:

open System 

let read() = Console.Read() 
let readLine() = Console.ReadLine() 

let clockMsg min max (todo : Lazy<_>) = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo.Value 

let name = readLine() 

clockMsg 0 8 <| lazy(printfn "Go to bed, %s!" name) 
clockMsg 8 12 <| lazy(printfn "Good morning, %s!" name) 
clockMsg 12 18 <| lazy(printfn "Good afternoon, %s!" name)