Тип опции
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В языках программирования (особенно в языках функционального программирования ) и теории типов или тип параметра , возможно, тип — это полиморфный тип , который представляет собой инкапсуляцию необязательного значения; например, он используется как возвращаемый тип функций, которые могут возвращать или не возвращать значимое значение при их применении. Он состоит из конструктора, который либо пуст (часто называется None
или Nothing
), или который инкапсулирует исходный тип данных A
(часто пишут Just A
или Some A
).
Отдельная, но родственная концепция вне функционального программирования, популярная в объектно-ориентированном программировании , называется типами, допускающими значение NULL (часто выражается как A?
). Основное различие между типами опций и типами, допускающими значение NULL, заключается в том, что типы опций поддерживают вложенность (например, Maybe (Maybe String)
≠ Maybe String
), а типы, допускающие значение NULL, — нет (например, String??
= String?
).
Теоретические аспекты
[ редактировать ]![]() | В этом разделе есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В теории типов это можно записать так: . Это выражает тот факт, что для данного набора значений в тип опции добавляет ровно одно дополнительное значение (пустое значение) к набору допустимых значений для . В программировании это отражается в том факте, что в языках, имеющих тегированные объединения , типы опций могут быть выражены как тегированное объединение инкапсулированного типа плюс тип единицы . [1]
В соответствии Карри–Ховарда типы опционов связаны с законом уничтожения для ∨: x∨1=1. [ как? ]
Тип опции также можно рассматривать как коллекцию, содержащую один или ноль элементов. [ оригинальное исследование? ]
Тип опции также является монадой , где: [2]
return = Just -- Wraps the value into a maybe
Nothing >>= f = Nothing -- Fails if the previous monad fails
(Just x) >>= f = f x -- Succeeds when both monads succeed
Монадическая природа типа параметра полезна для эффективного отслеживания сбоев и ошибок. [3]
Примеры
[ редактировать ]приглашенный
[ редактировать ]![]() | Этот раздел нуждается в дополнении : пример использования. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
В Agda тип опции называется Maybe
с вариантами nothing
и just a
.
С++
[ редактировать ]Начиная с C++17, тип опции определяется в стандартной библиотеке как template<typename T> std::optional<T>
.
Кок
[ редактировать ]![]() | Этот раздел нуждается в дополнении : пример использования. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
В Coq тип опции определяется как Inductive option (A:Type) : Type := | Some : A -> option A | None : option A.
.
Вяз
[ редактировать ]![]() | Этот раздел нуждается в дополнении : пример использования. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
В Elm тип опции определяется как type Maybe a = Just a | Nothing
. [4]
Ф#
[ редактировать ]![]() | Этот раздел нуждается в дополнении : определением. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
let showValue =
Option.fold (fun _ x -> sprintf "The value is: %d" x) "No value"
let full = Some 42
let empty = None
showValue full |> printfn "showValue full -> %s"
showValue empty |> printfn "showValue empty -> %s"
showValue full -> The value is: 42
showValue empty -> No value
Хаскелл
[ редактировать ]В Haskell тип опции определяется как data Maybe a = Nothing | Just a
. [5]
showValue :: Maybe Int -> String
showValue = foldl (\_ x -> "The value is: " ++ show x) "No value"
main :: IO ()
main = do
let full = Just 42
let empty = Nothing
putStrLn $ "showValue full -> " ++ showValue full
putStrLn $ "showValue empty -> " ++ showValue empty
showValue full -> The value is: 42
showValue empty -> No value
Идрис
[ редактировать ]В Idris тип опции определяется как data Maybe a = Nothing | Just a
.
showValue : Maybe Int -> String
showValue = foldl (\_, x => "The value is " ++ show x) "No value"
main : IO ()
main = do
let full = Just 42
let empty = Nothing
putStrLn $ "showValue full -> " ++ showValue full
putStrLn $ "showValue empty -> " ++ showValue empty
showValue full -> The value is: 42
showValue empty -> No value
Nim
[ редактировать ]![]() | Этот раздел нуждается в дополнении : определением. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
import std/options
proc showValue(opt: Option[int]): string =
opt.map(proc (x: int): string = "The value is: " & $x).get("No value")
let
full = some(42)
empty = none(int)
echo "showValue(full) -> ", showValue(full)
echo "showValue(empty) -> ", showValue(empty)
showValue(full) -> The Value is: 42
showValue(empty) -> No value
OCaml
[ редактировать ]В OCaml тип параметра определяется как type 'a option = None | Some of 'a
. [6]
let show_value =
Option.fold ~none:"No value" ~some:(fun x -> "The value is: " ^ string_of_int x)
let () =
let full = Some 42 in
let empty = None in
print_endline ("show_value full -> " ^ show_value full);
print_endline ("show_value empty -> " ^ show_value empty)
show_value full -> The value is: 42
show_value empty -> No value
Ржавчина
[ редактировать ]В Rust тип опции определяется как enum Option<T> { None, Some(T) }
. [7]
fn show_value(opt: Option<i32>) -> String {
opt.map_or("No value".to_owned(), |x| format!("The value is: {}", x))
}
fn main() {
let full = Some(42);
let empty = None;
println!("show_value(full) -> {}", show_value(full));
println!("show_value(empty) -> {}", show_value(empty));
}
show_value(full) -> The value is: 42
show_value(empty) -> No value
Скала
[ редактировать ]В Scala тип опции определяется как sealed abstract class Option[+A]
, тип, расширенный final case class Some[+A](value: A)
и case object None
.
object Main:
def showValue(opt: Option[Int]): String =
opt.fold("No value")(x => s"The value is: $x")
def main(args: Array[String]): Unit =
val full = Some(42)
val empty = None
println(s"showValue(full) -> ${showValue(full)}")
println(s"showValue(empty) -> ${showValue(empty)}")
showValue(full) -> The value is: 42
showValue(empty) -> No value
Стандартный ML
[ редактировать ]![]() | Этот раздел нуждается в дополнении : пример использования. Вы можете помочь, добавив к нему . ( июль 2022 г. ) |
В Standard ML тип опции определяется как datatype 'a option = NONE | SOME of 'a
.
Быстрый
[ редактировать ]В Swift тип опции определяется как enum Optional<T> { case none, some(T) }
но обычно записывается как T?
. [8]
func showValue(_ opt: Int?) -> String {
return opt.map { "The value is: \($0)" } ?? "No value"
}
let full = 42
let empty: Int? = nil
print("showValue(full) -> \(showValue(full))")
print("showValue(empty) -> \(showValue(empty))")
showValue(full) -> The value is: 42
showValue(empty) -> No value
Зиг
[ редактировать ]В Zig добавьте ? перед именем типа, например ?i32
чтобы сделать его необязательным типом.
Полезная нагрузка n может быть записана в операторе if или while , например if (opt) |n| { ... } else { ... }
и предложение else оценивается, если оно null
.
const std = @import("std");
fn showValue(allocator: std.mem.Allocator, opt: ?i32) ![]u8 {
return if (opt) |n|
std.fmt.allocPrint(allocator, "The value is: {}", .{n})
else
allocator.dupe(u8, "No value");
}
pub fn main() !void {
// Set up an allocator, and warn if we forget to free any memory.
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer std.debug.assert(gpa.deinit() == .ok);
const allocator = gpa.allocator();
// Prepare the standard output stream.
const stdout = std.io.getStdOut().writer();
// Perform our example.
const full = 42;
const empty = null;
const full_msg = try showValue(allocator, full);
defer allocator.free(full_msg);
try stdout.print("showValue(allocator, full) -> {s}\n", .{full_msg});
const empty_msg = try showValue(allocator, empty);
defer allocator.free(empty_msg);
try stdout.print("showValue(allocator, empty) -> {s}\n", .{empty_msg});
}
showValue(allocator, full) -> The value is: 42
showValue(allocator, empty) -> No value
См. также
[ редактировать ]- Тип результата
- Теговый союз
- Обнуляемый тип
- Шаблон нулевого объекта
- Обработка исключений
- Сопоставление с образцом
Ссылки
[ редактировать ]- ^ Милевский, Бартош (13 января 2015 г.). «Простые алгебраические типы данных» . Кафе программирования Бартоша Милевского . Типы сумм. «Мы могли бы закодировать «Может быть» как: data Maybe a = либо () a». Архивировано из оригинала 18 августа 2019 г. Проверено 18 августа 2019 г.
- ^ «Горсть монад — выучите Haskell во благо!» . www.learnyouahaskell.com . Проверено 18 августа 2019 г.
- ^ Хаттон, Грэм (25 ноября 2017 г.). «Что такое Монада?» . Компьютерный ютуб . Архивировано из оригинала 20 декабря 2021 г. Проверено 18 августа 2019 г.
- ^ «Может быть · Введение в Elm» . guide.elm-lang.org .
- ^ «6 предопределенных типов и классов» . www.haskell.org . Проверено 15 июня 2022 г.
- ^ «Библиотека OCaml: опция» . v2.ocaml.org . Проверено 15 июня 2022 г.
- ^ "Опция в ядре::option - Rust" . doc.rust-lang.org . 18 мая 2022 г. Проверено 15 июня 2022 г.
- ^ «Документация разработчика Apple» . разработчик.apple.com . Проверено 06 сентября 2020 г.