如果我部分应用这样的函数,请使用F#:
let sleep x = Async.Sleep x |> Async.RunSynchronously
let log date message= printfn "%s %s" date message
let getDate = DateTime.Now.ToString()
let logg = log getDate
logg "First"
sleep 1000
logg "Second"
sleep 1000
打印:
30/11/2018 19:54:25 First
30/11/2018 19:54:25 Second
对getDate的调用似乎在它产生的新部分函数中转换为实际日期。为什么会这样,是否有可能在每次调用此日志功能时使其调用getDate?
答案 0 :(得分:4)
因此,我必须在其后声明使用getDate()的链中的所有方法,并相应地对其进行调用,以使它们在调用时重新评估,否则它们将成为固定变量。是吗?
我反之亦然:call :script >
总是绑定一个值,但是在let
或let getDate ()
的情况下,这些值恰好是函数;它们基本上等同于
let sleep x
当然,如果您检查字节码,这并不是真正发生的事情,但是“道德上”确实如此。有了这些定义
let sleep = fun x -> Async.Sleep x |> Async.RunSynchronously
let getDate = fun () -> DateTime.Now.ToString()
您将获得相同的输出:
let sleep = fun x -> Async.Sleep x |> Async.RunSynchronously
let log = fun date message -> printfn "%s %s" date message
let getDate = fun () -> DateTime.Now.ToString()
let logg = fun x -> log (getDate ()) x
logg "First"
sleep 1000
logg "Second"
sleep 1000