Сравнение языков программирования (алгебраический тип данных)
В этой статье сравнивается синтаксис определения и создания экземпляра алгебраического типа данных (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
[ редактировать ]В 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
[ редактировать ]В 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
[ редактировать ]![]() | Этот раздел нуждается в расширении . Вы можете помочь, добавив к нему . ( декабрь 2021 г. ) |
В 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),
);
Скала
[ редактировать ]Скала 2
[ редактировать ]В 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
)
Скала 3
[ редактировать ]В 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).
Ссылки
[ редактировать ]- ^ «Eclipse Ceylon: объединение, пересечение и перечислимые типы» . ceylon-lang.org . Архивировано из оригинала 26 декабря 2022 г. Проверено 29 ноября 2021 г.
- ^ «Чистый 2.2 Ref Man» . Clean.cs.ru.nl . Проверено 29 ноября 2021 г.
- ^ «Индуктивные типы и рекурсивные функции — документация Coq 8.14.1» . coq.inria.fr . Проверено 30 ноября 2021 г.
- ^ «std::variant — cppreference.com» . ru.cppreference.com . Проверено 4 декабря 2021 г.
- ^ «Узоры» . dart.dev . Проверено 28 сентября 2023 г.
- ^ «Пользовательские типы · Введение в Elm» . guide.elm-lang.org . Проверено 29 ноября 2021 г.
- ^ Картермп. «Дискриминированные профсоюзы — F#» . docs.microsoft.com . Проверено 29 ноября 2021 г.
- ^ «Индуктивные типы и сопоставление с образцом — доказательство-ориентированное программирование в документации F*» . www.fstar-lang.org . Проверено 6 декабря 2021 г.
- ^ «Режим изо» . wiki.freepascal.org . Проверено 26 мая 2024 г.
- ^ «Типы записей» . www.freepascal.org . Проверено 5 декабря 2021 г.
- ^ «4 объявления и привязки» . www.haskell.org . Проверено 7 декабря 2021 г.
- ^ «Экземпляр перечисления» . Haxe — Кроссплатформенный набор инструментов . Проверено 29 ноября 2021 г.
- ^ «Определение собственных типов данных» . 10 августа 2011 г. Архивировано из оригинала 10 августа 2011 г. Проверено 3 декабря 2021 г.
- ^ «Типы и функции — документация Idris2 0.0» . idris2.readthedocs.io . Проверено 30 ноября 2021 г.
- ^ «JEP 409: Запечатанные классы» . openjdk.java.net . Проверено 5 декабря 2021 г.
- ^ «Типы · Язык Джулии» . docs.julialang.org . Проверено 3 декабря 2021 г.
- ^ «Запечатанные классы | Котлин» . Котлин в помощь . Проверено 29 ноября 2021 г.
- ^ Стэнли-Марбелл, Филипп (2003). Инферно-программирование с использованием Лимбо . Уайли . стр. 67–71. ISBN 978-0470843529 .
- ^ «Справочное руководство Mercury Language: Дискриминированные союзы» . www.mercurylang.org . Проверено 7 декабря 2021 г.
- ^ «Обзор Миранды» . www.cs.kent.ac.uk. Проверено 4 декабря 2021 г.
- ^ «Базовые варианты · rsdn/nameWiki » Гитхаб . Получено 0 декабря 2021 г.
- ^ «Руководство Нима» . nim-lang.org . Проверено 29 ноября 2021 г.
- ^ «OCaml — язык OCaml» . ocaml.org . Проверено 7 декабря 2021 г.
- ^ «Система типов · MLstate/opalang Wiki» . Гитхаб . Проверено 7 декабря 2021 г.
- ^ «Конструктор типов — OpenCog» . Wiki.opencog.org . Проверено 7 декабря 2021 г.
- ^ purescript/documentation , PureScript, 24 ноября 2021 г. , получено 30 ноября 2021 г.
- ^ PEP 484 — Подсказки по типам , Python
- ^ «2 Начинающая печатная ракетка» . docs.racket-lang.org . Проверено 4 декабря 2021 г.
- ^ «Варианты · Причина» . причинаml.github.io . Проверено 30 ноября 2021 г.
- ^ «Вариант | Руководство по языку ReScript» . Документация по ReScript . Проверено 30 ноября 2021 г.
- ^ "перечисление - Руст" . doc.rust-lang.org . Проверено 29 ноября 2021 г.
- ^ «Алгебраические типы данных» . Документация Скала . Проверено 29 ноября 2021 г.
- ^ «Определение типов данных» . homepages.inf.ed.ac.uk . Проверено 1 декабря 2021 г.
- ^ «Перечисления — язык программирования Swift (Swift 5.5)» . docs.swift.org . Проверено 29 ноября 2021 г.
- ^ «Документация — TypeScript для функциональных программистов» . www.typescriptlang.org . Проверено 29 ноября 2021 г.
- ^ «Справочник языков/домены — wiki.visual-prolog.com» . wiki.visual-prolog.com . Проверено 7 декабря 2021 г.