部分应用函数并在运行时动态调用该函数

时间:2018-11-30 19:44:14

标签: f# currying partial-application

如果我部分应用这样的函数,请使用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?

1 个答案:

答案 0 :(得分:4)

  

因此,我必须在其后声明使用getDate()的链中的所有方法,并相应地对其进行调用,以使它们在调用时重新评估,否则它们将成为固定变量。是吗?

我反之亦然:call :script >总是绑定一个值,但是在letlet 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