Jump to content

Тип опции

В языках программирования (особенно в языках функционального программирования ) и теории типов или тип параметра , возможно, тип — это полиморфный тип , который представляет собой инкапсуляцию необязательного значения; например, он используется как возвращаемый тип функций, которые могут возвращать или не возвращать значимое значение при их применении. Он состоит из конструктора, который либо пуст (часто называется 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]

приглашенный

[ редактировать ]

В Agda тип опции называется Maybe с вариантами nothing и just a.

Начиная с C++17, тип опции определяется в стандартной библиотеке как template<typename T> std::optional<T>.

В Coq тип опции определяется как Inductive option (A:Type) : Type := | Some : A -> option A | None : option A..

В Elm тип опции определяется как type Maybe a = Just a | Nothing. [4]

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
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 тип параметра определяется как 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

[ редактировать ]

В 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

См. также

[ редактировать ]
  1. ^ Милевский, Бартош (13 января 2015 г.). «Простые алгебраические типы данных» . Кафе программирования Бартоша Милевского . Типы сумм. «Мы могли бы закодировать «Может быть» как: data Maybe a = либо () a». Архивировано из оригинала 18 августа 2019 г. Проверено 18 августа 2019 г.
  2. ^ «Горсть монад — выучите Haskell во благо!» . www.learnyouahaskell.com . Проверено 18 августа 2019 г.
  3. ^ Хаттон, Грэм (25 ноября 2017 г.). «Что такое Монада?» . Компьютерный ютуб . Архивировано из оригинала 20 декабря 2021 г. Проверено 18 августа 2019 г.
  4. ^ «Может быть · Введение в Elm» . guide.elm-lang.org .
  5. ^ «6 предопределенных типов и классов» . www.haskell.org . Проверено 15 июня 2022 г.
  6. ^ «Библиотека OCaml: опция» . v2.ocaml.org . Проверено 15 июня 2022 г.
  7. ^ "Опция в ядре::option - Rust" . doc.rust-lang.org . 18 мая 2022 г. Проверено 15 июня 2022 г.
  8. ^ «Документация разработчика Apple» . разработчик.apple.com . Проверено 06 сентября 2020 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 511ab50332577859ac4d719e0cc3acb1__1705081200
URL1:https://arc.ask3.ru/arc/aa/51/b1/511ab50332577859ac4d719e0cc3acb1.html
Заголовок, (Title) документа по адресу, URL1:
Option type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)