Ayrat
я пользы от этого патерна не вижу особо
Vladislav
интересно, а можно сделать именно defaultarg на месте объявления?)
Ayrat
let (|IfNull|) def = function | null -> def | o -> o
Vladislav
я чет пытался и не вышло
Ayrat
я пытался и вышло! покажи как пытался
Vladislav
щас
Ayrat
щас
let (|IfNull|) def = function | null -> def | o -> o let f (IfNull "defualtString" o) = printfn "%s" o f null f "123"
Vladislav
let (|IfNull|) def = function | null -> def | o -> o
я пытался наркоманию писать в стиле этого
Vladislav
а там видимо только через функцию
Vladislav
но тогда и обычный defaultarg норм
Ayrat
но тогда и обычный defaultarg норм
ну тут просто сразу в параметрах функции деконстракт. Сахарок-с
Ayrat
не более
Ayrat
defaultArg разве не с опшнами работает?
Vladislav
да, ты прав, с ними
Ayrat
да, ты прав, с ними
а это между прочим - боксинг или аллокация
Ayrat
потому что ValueOption - отщепенец
Ayrat
на него нихуя не заточено
Aleksandr
Когда же, наконец, завезут элвисы в фшарп
Ayrat
он примерно бесполезен!
Aleksandr
С сишарп взаимодействовать проще будет
Ayrat
С сишарп взаимодействовать проще будет
ты путаешь elvis operator с null-propagation operator
Aleksandr
Не я один
Ayrat
на null-propagation есть открытый сто лет назад пропозал elvis в F# оксюморон, т.к. if уже им является
Vladislav
а это между прочим - боксинг или аллокация
let (|DefaultArg|) def obj = match obj with | null -> def | _ -> obj let defaultArgNull def obj = let (DefaultArg def obj) = obj obj
Ayrat
https://en.wikipedia.org/wiki/Elvis_operator
Vladislav
охуенно но нечитаемо))
Aleksandr
Не я один
Это оттуда цитата
Ayrat
let defaultArgNull (DefaultArg def obj) = obj
Ayrat
я сократил твои страдания на 2 строчки
Ayrat
а, лол, не сократил
Vladislav
по-истине язык сам по себе обфускатор
Ayrat
там же в паттерн надо что-то подать
Vladislav
даже исходник хуй прочитаешь
Ayrat
хуйню написал, забей
Ayrat
Это оттуда цитата
ну, как видишь, C#-еры не знаю что такое elvis
Ayrat
но им это не мешает
Ayrat
не будь как C#-ер!
Ayrat
бля
Ayrat
let defaultArgNull def (IfNull def obj) = obj
Ayrat
это РАБОТАЕТ
Ayrat
он может использовать def биндинг из первого аргумента в патерне второго аргумента
Ayrat
O_O
Ayrat
чиво блять
Ayrat
let defaultArgNull def (IfNull def obj) = obj defaultArgNull "1" null
Ayrat
ээээ, в тред призывается любитель спеки @vshapenko
Vasily
А что не так?
Ayrat
ну, многое
Vasily
У тебя второй параметр просто деконструкция
Vasily
Точнее не так
Vasily
Первый у тебя уже определен
Vasily
Поэтому можно пихать во второйц
Ayrat
Поэтому можно пихать во второйц
я могу их местами поменять
Ayrat
и это всё равно работает
Ayrat
что сделает следующий код? let defaultArgNull (IfNull def obj) (IfNull obj x) def = obj defaultArgNull null null "1"
Vasily
А что такое IfNull?
Ayrat
let (|IfNull|) def = function | null -> def | o -> o
Vasily
Ну все ок
Vasily
Вместо первого параметра подставляется паттерн
Vasily
Вместо второго тоже
Ayrat
так вернёт-то что?
Vasily
Вернет функцию создания объекта, как я понимаю
Ayrat
а вот хер
Ayrat
я могу ещё лучше вопрос задать, чтобы голову взорвать
Ayrat
let defaultArgNull (IfNull def obj) (IfNull obj x) def = printfn "obj: %A; x: %A; def: %A" obj x def defaultArgNull null null "1"
Ayrat
сразу скажу, напечатается obj: "1"; x: "1"; def: "1"
Vladislav
он кстати зачем-то боксит obj внутри
Ayrat
т.е. в начале резолвим третий параметр в "1" поэтому это позволяет от бектречится на первый параметр и разрезолвить его в "1" через актив патерн что позволяет нам разрезолвить 2ой параметр в "1" через актив патерн
Vladislav
// [27 7 - 27 32] IL_0000: ldarg.1 // obj IL_0001: box !!0/*a*/ IL_0006: brfalse.s IL_000a
Ayrat
логично
Vladislav
хотя там констрейнт на класс
Ayrat
он же с null сравнивает
Ayrat
а F# позволяет туда подавать структуры
Ayrat
значит надо забоксить
Vasily
obj у нас случаем не ключевое слово?