Ответ Брайана был оценен как лучшее объяснение option
типов, так что вы, вероятно, должны прочитать его :-).Я попытаюсь написать более краткое объяснение, используя простой пример F # ...
Допустим, у вас есть база данных продуктов, и вы хотите функцию, которая ищет в базе данных и возвращает продукт с указаннымназвание.Что должна делать функция, когда такого продукта нет?При использовании null
код может выглядеть следующим образом:
Product p = GetProduct(name);
if (p != null)
Console.WriteLine(p.Description);
Проблема этого подхода заключается в том, что вы не обязаны выполнять проверку, поэтому вы можете легко написать код, который выдаст неожиданное исключениекогда продукт не найден:
Product p = GetProduct(name);
Console.WriteLine(p.Description);
При использовании типа option
вы можете явно указать пропущенное значение .Типы, определенные в F #, не могут иметь значение null
, и когда вы хотите написать функцию, которая может возвращать или не возвращать значение, вы не можете вернуть Product
- вместо этого вам нужно вернуть option<Product>
, поэтому приведенный выше код будет выглядеть следующим образомэто (я добавил аннотации типов, чтобы вы могли видеть типы):
let (p:option<Product>) = GetProduct(name)
match p with
| Some prod -> Console.WriteLine(prod.Description)
| None -> () // No product found
Вы не можете напрямую получить доступ к свойству Description
, потому что результат поиска не равен Product
.Чтобы получить действительное значение Product
, вам нужно использовать сопоставление с образцом, которое заставляет вас обрабатывать случай, когда значение отсутствует.
Сводка. Подводя итог, цель *Тип 1031 * должен сделать аспект «отсутствующего значения» явным в типе и заставить вас проверять, доступно ли значение каждый раз, когда вы работаете со значениями, которые могут отсутствовать.