F # Вариант эквивалент С#? оператор
Я ищу способ получить значение параметра F # или использовать значение по умолчанию, если оно равно None.
Это кажется настолько распространенным я не могу поверить, что предопределенное не существует. Вот как я это делаю прямо сейчас:
// val getOptionValue : Lazy<'a> -> Option<'a> -> 'a
let getOptionValue (defaultValue : Lazy<_>) = function Some value -> value | None -> defaultValue.Force ()
Я (вроде) ищущий F # эквивалент С#? Оператор:
string test = GetString() ?? "This will be used if the result of GetString() is null.";
Никакая функция в модуле Option не делает то, что я считаю довольно простой задачей. Что мне не хватает?
Ответы
Ответ 1
Вы ищете defaultArg
[MSDN] ('T option -> 'T -> 'T
).
Он часто используется для предоставления значения по умолчанию для необязательных аргументов:
type T(?arg) =
member val Arg = defaultArg arg 0
let t1 = T(1)
let t2 = T() //t2.Arg is 0
Ответ 2
Вы можете легко создать своего собственного оператора, чтобы сделать то же самое.
let (|?) = defaultArg
Ваш пример С# станет
let getString() = (None:string option)
let test = getString() |? "This will be used if the result of getString() is None.";;
val getString : unit -> string option
val test : string = "This will be used if the result of getString() is None."
Здесь сообщение в блоге, которое идет немного подробнее.
Изменить: у Nikon the Third была намного лучшая реализация для оператора, поэтому я обновил его.