Боится, что нет синтаксического сахара для обнуляемых типов в F # (в отличие от C#, где вы просто добавить в ?
к типу). Так что да, код, который вы показываете там, выглядит ужасно подробным, но это единственный способ использовать тип System.Nullable<T>
в F #.
Однако, я подозреваю, что вы действительно хотите использовать option types. Там в несколько достойных примеров на странице MSDN:
let keepIfPositive (a : int) = if a > 0 then Some(a) else None
и
open System.IO
let openFile filename =
try
let file = File.Open (filename, FileMode.Create)
Some(file)
with
| exc -> eprintf "An exception occurred with message %s" exc.Message; None
Очевидно, что гораздо лучше использовать!
Опции по существу выполняют роль типов с нулевым значением в F #, и я должен думать, что вы действительно хотите использовать их, а не типы с нулевым значением (если только вы не взаимодействуете с C#). Разница в реализации заключается в том, что типы опций формируются с помощью дискриминационного объединения из Some(x)
и None
, тогда как Nullable<T>
является нормальным классом в BCL с небольшим количеством синтаксического сахара в C#.
Итак, как вы преобразовываете скаляр как 100 в "int option"? –
Первый пример в моем сообщении показывает это. Для примера, который вы указали, это просто 'Some (100)' – Noldorin
В настоящее время существует много синтаксической поддержки. См. Например, [все операторы, которые могут принимать значения с нулевым значением] (https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/symbol-and-operator-reference/nullable-operators), а также как функции «Option.ofNullable», «Option.toNullable» и многие другие. – Abel