Ayrat
я пользы от этого патерна не вижу особо
Vladislav
интересно, а можно сделать именно defaultarg на месте объявления?)
Ayrat
let (|IfNull|) def = function
| null -> def
| o -> o
Ayrat
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
Vladislav
а там видимо только через функцию
Vladislav
но тогда и обычный defaultarg норм
Ayrat
не более
Ayrat
defaultArg разве не с опшнами работает?
Vladislav
да, ты прав, с ними
Ayrat
потому что ValueOption - отщепенец
Ayrat
на него нихуя не заточено
Aleksandr
Когда же, наконец, завезут элвисы в фшарп
Ayrat
Ayrat
он примерно бесполезен!
Aleksandr
С сишарп взаимодействовать проще будет
Aleksandr
Ayrat
на null-propagation есть открытый сто лет назад пропозал
elvis в F# оксюморон, т.к. if уже им является
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
но им это не мешает
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
Поэтому можно пихать во второйц
Vladislav
Ayrat
Ayrat
и это всё равно работает
Ayrat
что сделает следующий код?
let defaultArgNull (IfNull def obj) (IfNull obj x) def = obj
defaultArgNull null null "1"
Vasily
А что такое IfNull?
Vladislav
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
Vladislav
он кстати зачем-то боксит obj внутри
Ayrat
т.е. в начале резолвим третий параметр в "1"
поэтому это позволяет от бектречится на первый параметр и разрезолвить его в "1" через актив патерн
что позволяет нам разрезолвить 2ой параметр в "1" через актив патерн
Ayrat
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 у нас случаем не ключевое слово?