Size: a a a

2021 April 09

I

IdiocyAcceptance in F# Chat
А F# сам по себе против нулей
источник

P

Pavel in F# Chat
Ну тут с опшионами можно..
источник

I

IdiocyAcceptance in F# Chat
И у тебя в общем и целом куча способов защитить свой код
источник

I

IdiocyAcceptance in F# Chat
Ну так у тебя уже всё есть: Option.defaultValue
источник

I

IdiocyAcceptance in F# Chat
defaultWith
источник

P

Pavel in F# Chat
Оно энергично вычислит и правую часть
источник

P

Pavel in F# Chat
Можно с lazy , но вербозно
источник

IM

Ilya Machekhin in F# Chat
А как же РЖДориентированное погромирование?
источник

I

IdiocyAcceptance in F# Chat
defaultWith не будет - ты передаёшь туда лямбду
источник

I

IdiocyAcceptance in F# Chat
В ряде случаев компилятор её закеширует
источник

P

Pavel in F# Chat
Дак тоже вербозно, надо выражение в лямбду заварачивать
источник

P

Pavel in F# Chat
let a = x ?? (read "someCfg")
vs
let a = x |> Option.defaultWith (fun () -> read "someCfg")
источник

P

Pavel in F# Chat
если не ошибся ещё во 2м случае
источник

I

IdiocyAcceptance in F# Chat
Тебе придётся для каждого типа AllowNullLiteral проставлять
источник

I

IdiocyAcceptance in F# Chat
Ибо по логике, F# компилятор не позволит тебе просто так сравнивать x с нулём (как здесь), если это рекорд
источник

I

IdiocyAcceptance in F# Chat
И даже при наличии такого оператора это поведение должно быть консистентным
источник

P

Pavel in F# Chat
Для опшинов же
источник

P

Pavel in F# Chat
Оператор
источник

PD

Prunkles Dreemurr in F# Chat
module Option =
 let defaultLazy (lz: Lazy<'a>) (x: 'a option) = x |> Option.defaultWith (fun () -> lz.Value)

let ( -? ) x lz = Option.defaultLazy lz x

> (Some 1) -? lazy 3;;
val it : int = 1
> None -? lazy 3;;    
val it : int = 3
> (Some 1) -? lazy (printfn "a"; 3);;
val it : int = 1
> None -? lazy (printfn "a"; 3);;
a
val it : int = 3
источник

PD

Prunkles Dreemurr in F# Chat
Осталось только более подходящее название выбрать, нежели -?
источник