Jump to content

Сравнение языков программирования (алгебраический тип данных)

В этой статье сравнивается синтаксис определения и создания экземпляра алгебраического типа данных (ADT), иногда также называемого объединением тегов , в различных языках программирования .

Примеры алгебраических типов данных

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

На Цейлоне ADT может быть определен с помощью: [1]

abstract class Tree()
    of empty | Node {}

object empty
    extends Tree() {}

final class Node(shared Integer val, shared Tree left, shared Tree right)
    extends Tree() {}

И создается как:

value myTree = Node(42, Node(0, empty, empty), empty);

В Clean ADT может быть определен с помощью: [2]

:: Tree
  = Empty
  | Node Int Tree Tree

И создается как:

myTree = Node 42 (Node 0 Empty Empty) Empty

В Coq ADT может быть определен с помощью: [3]

Inductive tree : Type :=
| empty : tree
| node : nat -> tree -> tree -> tree.

И создается как:

Definition my_tree := node 42 (node 0 empty empty) empty.

В C++ ADT может быть определен с помощью: [4]

struct Empty final {};

struct Node final {
    int value;
    std::unique_ptr<std::variant<Empty, Node>> left;
    std::unique_ptr<std::variant<Empty, Node>> right;
};

using Tree = std::variant<Empty, Node>;

И создается как:

Tree myTree { Node{
    42,
    std::make_unique<Tree>(Node{
        0,
        std::make_unique<Tree>(),
        std::make_unique<Tree>()
    }),
    std::make_unique<Tree>()
} };

В Dart ADT может быть определен с помощью: [5]

sealed class Tree {}

final class Empty extends Tree {}

final class Node extends Tree {
  final int value;
  final Tree left, right;

  Node(this.value, this.left, this.right);
}

И создается как:

final myTree = Node(42, Node(0, Empty(), Empty()), Empty());

В Elm ADT можно определить с помощью: [6]

type Tree
  = Empty
  | Node Int Tree Tree

И создается как:

myTree = Node 42 (Node 0 Empty Empty) Empty

В F# ADT может быть определен с помощью: [7]

type Tree =
    | Empty
    | Node of int * Tree * Tree

И создается как:

let myTree = Node(42, Node(0, Empty, Empty), Empty)

В F* ADT может быть определен с помощью: [8]

type tree =
  | Empty : tree
  | Node : value:nat -> left:tree -> right:tree -> tree

И создается как:

let my_tree = Node 42 (Node 0 Empty Empty) Empty

Бесплатный Паскаль

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

В Free Pascal (в стандартном режиме ISO Pascal) [9] ), ADT может быть определен с вариантными записями: [10]

{$mode ISO}
program MakeTree;

type TreeKind = (Empty, Node);
  PTree = ^Tree;
  Tree = record
    case Kind: TreeKind of
      Empty: ();
      Node: (
        Value: Integer;
        Left, Right: PTree;
      );
  end;

И создается как:

var MyTree: PTree;

begin new(MyTree, Node);
  with MyTree^ do begin
    Value := 42;
    new(Left,  Node);
    with Left^ do begin
      Value := 0;
      new(Left,  Empty);
      new(Right, Empty);
    end;
    new(Right, Empty);
  end;
end.

В Haskell ADT может быть определен с помощью: [11]

data Tree
    = Empty
    | Node Int Tree Tree

И создается как:

myTree = Node 42 (Node 0 Empty Empty) Empty

Смешанный

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

В Haxe ADT может быть определен с помощью: [12]

enum Tree {
	Empty;
	Node(value:Int, left:Tree, right:Tree);
}

И создается как:

var myTree = Node(42, Node(0, Empty, Empty), Empty);

Надеяться

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

В Hope ADT может быть определен с помощью: [13]

data tree == empty
          ++ node (num # tree # tree);

И создается как:

dec mytree : tree;
--- mytree <= node (42, node (0, empty, empty), empty);

В Idris ADT может быть определен с помощью: [14]

data Tree
    = Empty
    | Node Nat Tree Tree

И создается как:

myTree : Tree
myTree = Node 42 (Node 0 Empty Empty) Empty

В Java ADT может быть определен с помощью: [15]

sealed interface Tree {
    record Empty() implements Tree {}
    record Node(int value, Tree left, Tree right) implements Tree {}
}

И создается как:

var myTree = new Tree.Node(
    42,
    new Tree.Node(0, new Tree.Empty(), new Tree.Empty()),
    new Tree.Empty()
);

В Julia ADT может быть определен с помощью: [16]

struct Empty
end

struct Node
    value::Int
    left::Union{Empty, Node}
    right::Union{Empty, Node}
end

const Tree = Union{Empty, Node}

И создается как:

mytree = Node(42, Node(0, Empty(), Empty()), Empty())

В Kotlin ADT может быть определен с помощью: [17]

sealed class Tree {
    object Empty : Tree()
    data class Node(val value: Int, val left: Tree, val right: Tree) : Tree()
}

И создается как:

val myTree = Tree.Node(
    42,
    Tree.Node(0, Tree.Empty, Tree.Empty),
    Tree.Empty,
)

В Limbo ADT может быть определен с помощью: [18]

Tree: adt {
	pick {
	Empty =>
	Node =>
		value: int;
		left: ref Tree;
		right: ref Tree;
	}
};

И создается как:

myTree := ref Tree.Node(
	42,
	ref Tree.Node(0, ref Tree.Empty(), ref Tree.Empty()),
	ref Tree.Empty()
);

Меркурий

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

В Mercury ADT может быть определен с помощью: [19]

:- type tree
    --->    empty
    ;       node(int, tree, tree).

И создается как:

:- func my_tree = tree.
my_tree = node(42, node(0, empty, empty), empty).

В Miranda ADT может быть определен с помощью: [20]

tree ::=
    Empty
    | Node num tree tree

И создается как:

my_tree = Node 42 (Node 0 Empty Empty) Empty

В Nemerle ADT может быть определен с помощью: [21]

variant Tree
{
    | Empty
    | Node {
        value: int;
        left: Tree;
        right: Tree;
    }
}

И создается как:

def myTree = Tree.Node(
    42,
    Tree.Node(0, Tree.Empty(), Tree.Empty()),
    Tree.Empty(),
);

В Nim ADT может быть определен с помощью: [22]

type
  TreeKind = enum
    tkEmpty
    tkNode

  Tree = ref TreeObj

  TreeObj = object
    case kind: TreeKind
    of tkEmpty:
      discard
    of tkNode:
      value: int
      left, right: Tree

И создается как:

let myTree = Tree(kind: tkNode, value: 42,
                  left: Tree(kind: tkNode, value: 0,
                             left: Tree(kind: tkEmpty),
                             right: Tree(kind: tkEmpty)),
                  right: Tree(kind: tkEmpty))

В OCaml ADT может быть определен с помощью: [23]

type tree =
  | Empty
  | Node of int * tree * tree

И создается как:

let my_tree = Node (42, Node (0, Empty, Empty), Empty)

В Opa ADT может быть определен с помощью: [24]

type tree =
  { empty } or
  { node, int value, tree left, tree right }

И создается как:

my_tree = {
  node,
  value: 42,
  left: {
    node,
    value: 0,
    left: { empty },
    right: { empty }
  },
  right: { empty }
}

В OpenCog ADT может быть определен с помощью: [25]

Чистый скрипт

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

В PureScript ADT может быть определен с помощью: [26]

data Tree
  = Empty
  | Node Int Tree Tree

И создается как:

myTree = Node 42 (Node 0 Empty Empty) Empty

В Python ADT может быть определен с помощью: [27]

from __future__ import annotations
from dataclasses import dataclass

@dataclass
class Empty:
    pass

@dataclass
class Node:
    value: int
    left: Tree
    right: Tree

Tree = Empty | Node

И создается как:

my_tree = Node(42, Node(0, Empty(), Empty()), Empty())

В Typed Racket ADT может быть определен с помощью: [28]

(struct Empty ())
(struct Node ([value : Integer] [left : Tree] [right : Tree]))
(define-type Tree (U Empty Node))

И создается как:

(define my-tree (Node 42 (Node 0 (Empty) (Empty)) (Empty)))

В Reason ADT может быть определен с помощью: [29]

type Tree =
  | Empty
  | Node(int, Tree, Tree);

И создается как:

let myTree = Node(42, Node(0, Empty, Empty), Empty);

Рескрипт

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

В ReScript ADT может быть определен с помощью: [30]

type rec Tree =
  | Empty
  | Node(int, Tree, Tree)

И создается как:

let myTree = Node(42, Node(0, Empty, Empty), Empty)

Ржавчина

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

В Rust ADT может быть определен с помощью: [31]

enum Tree {
    Empty,
    Node(i32, Box<Tree>, Box<Tree>),
}

И создается как:

let my_tree = Tree::Node(
    42,
    Box::new(Tree::Node(0, Box::new(Tree::Empty), Box::new(Tree::Empty)),
    Box::new(Tree::Empty),
);

В Scala 2 ADT может быть определен с помощью: [ нужна ссылка ]

sealed abstract class Tree extends Product with Serializable

object Tree {
  final case object Empty extends Tree
  final case class Node(value: Int, left: Tree, right: Tree)
      extends Tree
}

И создается как:

val myTree = Tree.Node(
  42,
  Tree.Node(0, Tree.Empty, Tree.Empty),
  Tree.Empty
)

В Scala 3 ADT может быть определен с помощью: [32]

enum Tree:
  case Empty
  case Node(value: Int, left: Tree, right: Tree)

И создается как:

val myTree = Tree.Node(
  42,
  Tree.Node(0, Tree.Empty, Tree.Empty),
  Tree.Empty
)

Стандартный ML

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

В стандартном ML ADT может быть определен с помощью: [33]

datatype tree =
    EMPTY
  | NODE of int * tree * tree

И создается как:

val myTree = NODE (42, NODE (0, EMPTY, EMPTY), EMPTY)

В Swift ADT может быть определен с помощью: [34]

enum Tree {
    case empty
    indirect case node(Int, Tree, Tree)
}

И создается как:

let myTree: Tree = .node(42, .node(0, .empty, .empty), .empty)

Машинопись

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

В TypeScript ADT может быть определен с помощью: [35]

type Tree =
  | { kind: "empty" }
  | { kind: "node"; value: number; left: Tree; right: Tree };

И создается как:

const myTree: Tree = {
  kind: "node",
  value: 42,
  left: {
    kind: "node",
    value: 0,
    left: { kind: "empty" },
    right: { kind: "empty" },
  },
  right: { kind: "empty" },
};

Визуальный Пролог

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

В Visual Prolog ADT может быть определен с помощью: [36]

domains
    tree = empty; node(integer, tree, tree).

И создается как:

constants
    my_tree : tree = node(42, node(0, empty, empty), empty).
  1. ^ «Eclipse Ceylon: объединение, пересечение и перечислимые типы» . ceylon-lang.org . Архивировано из оригинала 26 декабря 2022 г. Проверено 29 ноября 2021 г.
  2. ^ «Чистый 2.2 Ref Man» . Clean.cs.ru.nl . Проверено 29 ноября 2021 г.
  3. ^ «Индуктивные типы и рекурсивные функции — документация Coq 8.14.1» . coq.inria.fr . Проверено 30 ноября 2021 г.
  4. ^ «std::variant — cppreference.com» . ru.cppreference.com . Проверено 4 декабря 2021 г.
  5. ^ «Узоры» . dart.dev . Проверено 28 сентября 2023 г.
  6. ^ «Пользовательские типы · Введение в Elm» . guide.elm-lang.org . Проверено 29 ноября 2021 г.
  7. ^ Картермп. «Дискриминированные профсоюзы — F#» . docs.microsoft.com . Проверено 29 ноября 2021 г.
  8. ^ «Индуктивные типы и сопоставление с образцом — доказательство-ориентированное программирование в документации F*» . www.fstar-lang.org . Проверено 6 декабря 2021 г.
  9. ^ «Режим изо» . wiki.freepascal.org . Проверено 26 мая 2024 г.
  10. ^ «Типы записей» . www.freepascal.org . Проверено 5 декабря 2021 г.
  11. ^ «4 объявления и привязки» . www.haskell.org . Проверено 7 декабря 2021 г.
  12. ^ «Экземпляр перечисления» . Haxe — Кроссплатформенный набор инструментов . Проверено 29 ноября 2021 г.
  13. ^ «Определение собственных типов данных» . 10 августа 2011 г. Архивировано из оригинала 10 августа 2011 г. Проверено 3 декабря 2021 г.
  14. ^ «Типы и функции — документация Idris2 0.0» . idris2.readthedocs.io . Проверено 30 ноября 2021 г.
  15. ^ «JEP 409: Запечатанные классы» . openjdk.java.net . Проверено 5 декабря 2021 г.
  16. ^ «Типы · Язык Джулии» . docs.julialang.org . Проверено 3 декабря 2021 г.
  17. ^ «Запечатанные классы | Котлин» . Котлин в помощь . Проверено 29 ноября 2021 г.
  18. ^ Стэнли-Марбелл, Филипп (2003). Инферно-программирование с использованием Лимбо . Уайли . стр. 67–71. ISBN  978-0470843529 .
  19. ^ «Справочное руководство Mercury Language: Дискриминированные союзы» . www.mercurylang.org . Проверено 7 декабря 2021 г.
  20. ^ «Обзор Миранды» . www.cs.kent.ac.uk. ​Проверено 4 декабря 2021 г.
  21. ^ «Базовые варианты · rsdn/nameWiki » Гитхаб . Получено 0 декабря 2021 г.
  22. ^ «Руководство Нима» . nim-lang.org . Проверено 29 ноября 2021 г.
  23. ^ «OCaml — язык OCaml» . ocaml.org . Проверено 7 декабря 2021 г.
  24. ^ «Система типов · MLstate/opalang Wiki» . Гитхаб . Проверено 7 декабря 2021 г.
  25. ^ «Конструктор типов — OpenCog» . Wiki.opencog.org . Проверено 7 декабря 2021 г.
  26. ^ purescript/documentation , PureScript, 24 ноября 2021 г. , получено 30 ноября 2021 г.
  27. ^ PEP 484 — Подсказки по типам , Python
  28. ^ «2 Начинающая печатная ракетка» . docs.racket-lang.org . Проверено 4 декабря 2021 г.
  29. ^ «Варианты · Причина» . причинаml.github.io . Проверено 30 ноября 2021 г.
  30. ^ «Вариант | Руководство по языку ReScript» . Документация по ReScript . Проверено 30 ноября 2021 г.
  31. ^ "перечисление - Руст" . doc.rust-lang.org . Проверено 29 ноября 2021 г.
  32. ^ «Алгебраические типы данных» . Документация Скала . Проверено 29 ноября 2021 г.
  33. ^ «Определение типов данных» . homepages.inf.ed.ac.uk . Проверено 1 декабря 2021 г.
  34. ^ «Перечисления — язык программирования Swift (Swift 5.5)» . docs.swift.org . Проверено 29 ноября 2021 г.
  35. ^ «Документация — TypeScript для функциональных программистов» . www.typescriptlang.org . Проверено 29 ноября 2021 г.
  36. ^ «Справочник языков/домены — wiki.visual-prolog.com» . wiki.visual-prolog.com . Проверено 7 декабря 2021 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 79fc457d09190eafcdfaf65b5b59b627__1716744120
URL1:https://arc.ask3.ru/arc/aa/79/27/79fc457d09190eafcdfaf65b5b59b627.html
Заголовок, (Title) документа по адресу, URL1:
Comparison of programming languages (algebraic data type) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)