Частично применить функцию и динамически вызывать эту функцию во время выполнения - PullRequest
0 голосов
/ 30 ноября 2018

Используя 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 голосов
/ 30 ноября 2018

, поэтому я должен объявить все методы в цепочке, которые используют getDate с () после них, и вызывать их соответствующим образом, чтобы они переоценивали при вызове, в противном случае они становятся фиксированными переменными.Это правильно?

Я бы сказал иначе: 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

вы получите тот же результат:

30/11/2018 19:59:40 First
30/11/2018 19:59:41 Second
...