Duh? помощь с типами опций f # - PullRequest
1 голос
/ 20 ноября 2010

У меня зависание мозга на типах опций f #.У меня есть 3 книги и я читаю все, что могу, но я их не получаю.

Есть ли у кого-то четкое и краткое объяснение и, возможно, пример из реального мира?

TIA

Gary

Ответы [ 2 ]

5 голосов
/ 20 ноября 2010

Ответ Брайана был оценен как лучшее объяснение 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 * должен сделать аспект «отсутствующего значения» явным в типе и заставить вас проверять, доступно ли значение каждый раз, когда вы работаете со значениями, которые могут отсутствовать.

2 голосов
/ 20 ноября 2010

См.,

http://msdn.microsoft.com/en-us/library/dd233245.aspx

Интуиция за типом опции заключается в том, что он "реализует" нулевое значение.Но в отличие от нуля, вы должны явно требовать , чтобы значение могло быть нулевым, тогда как в большинстве других языков ссылки могут быть нулевыми по умолчанию.Существует сходство с SQL NULL / NOT NULL, если вы знакомы с ними.

Почему это умно?Это умно, потому что язык может предполагать, что без вывода любого выражения никогда не может быть нулевым.Следовательно, он может исключить все проверки нулевых указателей из кода, что дает большую дополнительную скорость.Кроме того, это освобождает программиста от необходимости все равно проверять нулевой регистр, если он или она хочет создать безопасный код.

В тех немногих случаях, когда программе требуется нулевое значение, тип опции существует.В качестве примера рассмотрим функцию, которая запрашивает ключ внутри INI-файла.Возвращаемый ключ является целым числом, но файл .ini может не содержать ключ.В этом случае имеет смысл возвращать 'null', если ключ не найден.Ни одно из целочисленных значений не является полезным - пользователь мог ввести именно это целочисленное значение в файл.Следовательно, нам нужно «поднять» область целых чисел и присвоить ей новое значение, представляющее «нет информации», то есть ноль.Таким образом, мы заключаем «int» в «int option».Теперь, если нет целочисленного значения, мы получим «None», а если есть целочисленное значение, мы получим «Some (N)», где N - рассматриваемое целочисленное значение.

Есть два красивыхпоследствия выбора.Во-первых, мы можем использовать общие возможности сопоставления с образцом в F #, чтобы различать значения, например, в выражении регистра.Во-вторых, структура алгебраических типов данных, используемых для определения типа параметра, предоставляется программисту.То есть, если бы в F # не было типа option, мы могли бы создать его сами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...