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