Ayrat
Даже в многопоточных приложениях
Bonart
Ayrat
Bonart
Все ок
Что используется для? lock обычный?
Ayrat
Ayrat
Внутри него скорее всего лок
Bonart
system.Lazy!
Ясно, внутри него точно лок. Не все знают, что опциональный
Ayrat
Ayrat
Стандартная оптимизация же
Ayrat
Если не вычислено, то залочь и если все ещё не вычислено - вычисли
Bonart
Там три стратегии. Одна вообще не многопоточная, вторая проверяет значение после создания (может быть создано несколько экземпляров, доступен только один), третья по умолчанию лочит
Dr. Friedrich
Дабл чек с локом?
Нету там никакого даблчека, просто лок: https://github.com/dotnet/corefx/blob/f15d18e904534a1dcadfd86a17340950d1d06e21/src/Common/src/CoreLib/System/Lazy.cs#L334-L349
Dr. Friedrich
Dr. Friedrich
Скажем, режим PublicationOnly сделан на Interlocked.
Dr. Friedrich
Для низкоконкурентных сценариев ок
Ayrat
Ayrat
Dr. Friedrich
По-моему, ExecutionAndPublication там.
Dr. Friedrich
https://github.com/Microsoft/visualfsharp/blob/44c7e10ca432d8f245a6d8f8e0ec19ca8c72edaf/src/fsharp/FSharp.Core/prim-types.fs#L5753 ношол
Dr. Friedrich
Смешные и стрёмные комменты в этом модуле :)
Ayrat
Да, lazy в F# тред сейф, я ещё раз в этом убедился, спасибо)
Ayrat
кстати, вот этот тайп алиас не работает
type 'T ``lazy`` = Lazy<'T>
Ayrat
он по идее должен позволять писать
let f (a: _ lazy) = ...
Ayrat
Но не позволяет
Pavel
зачем ? let (l : _ Lazy) = lazy i;;
Ayrat
хм
Ayrat
не, для этого есть встроенный патерн
Ayrat
let (Lazy l) = lazy i
Ayrat
но я тебя понял
Pavel
let (y : int Option) = None;;
Ayrat
нененене, для Option есть ещё один тайп алиас
Ayrat
option
Ayrat
с маленькой буквы
Ayrat
для lazy тоже сделали тайп алиас с маленькой буквы
Pavel
правильно. но какда их нет то создавать их и не нужно. достаточно местами перствить
Ayrat
но походу он конфликтует с ключевым словом lazy
Ayrat
мой поинт был в том что он не работает
Ayrat
а не в том что нельзя пользоваться другим
Pavel
ну ок
Pavel
но на самом деле работает ) let (l : _ ``lazy``) = lazy i;;
Ayrat
ты опять не понял
Ayrat
о, ты исправил)
Ayrat
и нет, не работает кстати)
Ayrat
error FS0101: This construct is deprecated. This type is obsolete. Please use System.Lazy instead.
Ayrat
даж не варнинг
Pavel
че бы? > let (l : _ ``lazy``) = lazy i;;
val l : int lazy = Value is not created.
Ayrat
Я даже в FSI послал
Ayrat
один хер, ошибку кидает
Pavel
у тебя плохой fsi )
Ayrat
и компилятор плохой)
Pavel
https://ideone.com/gURWTF
Pavel
ты его видно сломал пока чинил)
Ayrat
Подозреваю что на ideone как раз устаревшее что-то
Ayrat
F# (mono 4.0.0)
Pavel
ну у меня то Microsoft (R) F# Interactive version 10.2.3 for F# 4.5
Ayrat
Очень подозрительно
Ayrat
Ayrat
Pavel
тип объявить не пробывал?
Ayrat
так он объявлен в F# Core
Pavel
а ты еще раз руками как в ideone
Ayrat
https://github.com/Microsoft/visualfsharp/blob/44c7e10ca432d8f245a6d8f8e0ec19ca8c72edaf/src/fsharp/FSharp.Core/prim-types.fs#L5776
Ayrat
ты своим объявлением шадовишь их объвление к которому и прикручена ошибка комплитора
Pavel
логично.
Pavel
а ошибка не логичная
Pavel
хотя я подозреваю откуда ноги
Vasiliy
почему в linq не добавляют какой-нибудь OrWhere или это я кривой?
Ayrat
Vasiliy
вместо склейки условий через AND. можно было бы собирать условия с OR
Aleksandr
оказывается, lazy работает в каком-то смысле рекурсивно, что ли? если __.Force не вызывается, функция format тоже не отработает. Почему так?
Ayrat
Ayrat
всё что попадает под действите lazy (а он правоассоциативный) не будет вычислено
Ayrat
Ayrat
[1..10].Where(fun x -> x > 5) // 6..10
а что должен делать OrWhere?
Vasiliy
query = keys
.Aggregate(query,
(exec, mileDirKey) =>
exec.Where(x => x.MilestoneId == mileDirKey.Key.MilestoneId && x.DirectionIdBusiness == mileDirKey.Key.DirectionId));
и вот тут, что логично, мне будут добавлены условия Where, но вместе они будут идти через AND. А хотелось бы иногда,чтобы шли через OR
Vasiliy
правда да, это c#. не бейте.
Alexander
Тогда смысл цепочки вызовов исчезает
Aleksandr
Alexander
Что ты получаешь измененный список, потому что для OrWhere, надо знать еще изначальный