Подтвердить что ты не робот

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 не делает то, что я считаю довольно простой задачей. Что мне не хватает?

4b9b3361

Ответ 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 была намного лучшая реализация для оператора, поэтому я обновил его.