Ayrat
Оно типа правоассоциативное
То есть запись вида
lazy f a
Будет читаться как
lazy (f a)
Hog
Я никогда не понимал твою нелюбовь к скобочкам
Hog
^fun - вот это всё
Ayrat
И что самое крутое, все что справа от lazy вообще проигнорится компилятором даже если там явно вычисленное выражение.
Например, обычное поведение
f : unit -> unit
f (printf "1")
Вызовет рассчёт аргумента, то есть печать в консоль, потом уже вызовет функцию.
lazy f (printf "1")
Принтф не вызовется
Ayrat
То есть он настолько честный что даже особым образом компилятор останавливает
Hog
Оно небось в лямбду какую неявную заворачивается
Hog
?
Ayrat
Якобы равноценная замена
let inline myLazy arg = fun () -> arg
myLazy (printf "1")
Ayrat
Но она не работает
Ayrat
Не смотря на инлайн
Romɑn
Ayrat
Тут будет вычислен аргумент и произведена печать в консоль
Ayrat
Romɑn
@AnutaU https://twitter.com/mvsmal/status/1089238275775254529?s=19
Hog
Romɑn
@Dolfik акка нинужна
Hog
Не?
Ayrat
Nikolay
Ayrat
Не?
Нет, даже не смотря на инлайн, компилятор вычисляет аргумент.
Анна
Ayrat
То есть единственный выход писать ебучую лямбду, инлайн делать руками)
А вот магию с лейзи может только ключевое слово lazy
Hog
myLazy f = f (fun () -> printfn 1)
Ayrat
Потому и говорю что оно очень особое, его нельзя повторить
Ayrat
Ayrat
Сделать f (printf "1") чтобы он не вычислял аргумент может только lazy
Hog
Нуок :)
Ayrat
Нуок :)
Это же очень круто!!! Ты не оценил! Оно же с мемоизацией5!!!
Анна
Внутри f
x
Ayrat
А ну-ка сделайте так чтобы передаваемый сюда arg не был вычислен
let myLazy f arg = ...
Ayrat
И верните ленивое, мемоизируемое вычисление
Hog
Hog
Анна
Про мемоизацию сначала речь не шла!
Ayrat
Ayrat
Но мемоизация это ещё один бонус да. Огромный
Hog
Анна
Анна
Ayrat
Мой поинт в том что написать руками функцию которая не напечатает 1 в консоли как в примере ниже нельзя
lazy printf "1"
Hog
Там же резалт надо форсить. А что это как не вызов этой неявной лямбды?
Ayrat
Анна
Да, я тоже за то, что внутри там может быть валенок!
Ayrat
Но это детали имплементации
Ayrat
x
x
@omgszer говорил что за такое надо давать лещей )
Hog
Я в середине первой только. До 7-й ещё недели две :(
Ayrat
let inline force (l: Lazy<_>) = l.Force()
let (|Lazy|) = force
let l = lazy Some 1
match l with
| Lazy None -> ...
| Lazy (Some _) -> ... //Здесь уже не будет вычисления лейзи так как мемоизация
Hog
Vladislav
Vladislav
Или вообще не трогать
Pavel
Ayrat
Например отложенные списки (стримы)
Hog
Ayrat
Hog
О! Тебе дали неделю на дегустацию?
Ayrat
Ayrat
Ayrat
К тому же у тебя может быть наоборот
Pavel
ок
Ayrat
match opt with
| Some (Lazy 1) -> ...
Ayrat
И сразу засада
Ayrat
А патерн матчинг справляется
Ayrat
И ещё, можно сразу в функциях лейзи раскладывать
Ayrat
Короче от такого патерна пользы сильно дохуя
Pavel
хотя some от lazy дичью отдает
Ayrat