Lably
Skip to content

Comparison of programming languages (algebraic data type)

  • 32 min read
  • 1 chapter

Explore on Lably

ToursExplore Lably’s 3D tours

Examples of algebraic data types

ATS

In ATS, an ADT may be defined with:

<span id="mwGw"></span><span class="n" id="mwHA">datatype</span> <span class="n" id="mwHQ">tree</span> <span class="o" id="mwHg">=</span> <span class="o" id="mwHw">|</span> <span class="nc" id="mwIA">Empty</span> <span class="k" id="mwIQ">of</span> <span class="bp" id="mwIg">()</span> <span class="o" id="mwIw">|</span> <span class="nc" id="mwJA">Node</span> <span class="k" id="mwJQ">of</span> <span class="o" id="mwJg">(</span><span class="kt" id="mwJw">int</span><span class="o" id="mwKA">,</span> <span class="n" id="mwKQ">tree</span><span class="o" id="mwKg">,</span> <span class="n" id="mwKw">tree</span><span class="o" id="mwLA">)</span>

And instantiated as:

<span id="mwMA"></span><span class="k" id="mwMQ">val</span> <span class="n" id="mwMg">my_tree</span> <span class="o" id="mwMw">=</span> <span class="nc" id="mwNA">Node</span><span class="o" id="mwNQ">(</span><span class="mi" id="mwNg">42</span><span class="o" id="mwNw">,</span> <span class="nc" id="mwOA">Node</span><span class="o" id="mwOQ">(</span><span class="mi" id="mwOg">0</span><span class="o" id="mwOw">,</span> <span class="nc" id="mwPA">Empty</span><span class="o" id="mwPQ">,</span> <span class="nc" id="mwPg">Empty</span><span class="o" id="mwPw">),</span> <span class="nc" id="mwQA">Empty</span><span class="o" id="mwQQ">)</span>

Additionally in ATS dataviewtypes are the linear type version of ADTs for the purpose of providing in the setting of manual memory management with the convenience of pattern matching. An example program might look like:

<span id="mwSg"></span><span class="c" id="mwSw">(* Alternatively one can use the datavtype keyword *)</span> <span class="n" id="mwTA">dataviewtype</span> <span class="n" id="mwTQ">int_or_string_vt</span> <span class="o" id="mwTg">(</span><span class="kt" id="mwTw">bool</span><span class="o" id="mwUA">)</span> <span class="o" id="mwUQ">=</span> <span class="o" id="mwUg">|</span> <span class="nc" id="mwUw">String_vt</span> <span class="o" id="mwVA">(</span><span class="bp" id="mwVQ">true</span><span class="o" id="mwVg">)</span> <span class="k" id="mwVw">of</span> <span class="kt" id="mwWA">string</span> <span class="o" id="mwWQ">|</span> <span class="nc" id="mwWg">Int_vt</span> <span class="o" id="mwWw">(</span><span class="bp" id="mwXA">false</span><span class="o" id="mwXQ">)</span> <span class="k" id="mwXg">of</span> <span class="kt" id="mwXw">int</span> <span class="c" id="mwYA">(* Alternatively one can use the vtypedef keyword *)</span> <span class="n" id="mwYQ">viewtypedef</span> <span class="nc" id="mwYg">Int_or_String_vt</span> <span class="o" id="mwYw">=</span> <span class="o" id="mwZA">[</span><span class="n" id="mwZQ">b</span><span class="o" id="mwZg">:</span> <span class="kt" id="mwZw">bool</span><span class="o" id="mwaA">]</span> <span class="n" id="mwaQ">int_or_string_vt</span> <span class="n" id="mwag">b</span> <span class="n" id="mwaw">fn</span> <span class="n" id="mwbA">print_int_or_string</span> <span class="o" id="mwbQ">(</span><span class="n" id="mwbg">i_or_s</span><span class="o" id="mwbw">:</span> <span class="nc" id="mwcA">Int_or_String_vt</span><span class="o" id="mwcQ">):</span> <span class="n" id="mwcg">void</span> <span class="o" id="mwcw">=</span> <span class="n" id="mwdA">case</span><span class="o" id="mwdQ">+</span> <span class="n" id="mwdg">i_or_s</span> <span class="k" id="mwdw">of</span> <span class="c" id="mweA">(* ~ indicates i_or_s will be implicitly freed in this case *)</span> <span class="o" id="mweQ">|</span> <span class="o" id="mweg">~</span><span class="nc" id="mwew">String_vt</span><span class="o" id="mwfA">(</span><span class="n" id="mwfQ">s</span><span class="o" id="mwfg">)</span> <span class="o" id="mwfw">=></span> <span class="n" id="mwgA">println</span><span class="o" id="mwgQ">!(</span><span class="n" id="mwgg">s</span><span class="o" id="mwgw">)</span> <span class="c" id="mwhA">(* @ indicates i_or_s must be explicitly freed in this case *)</span> <span class="o" id="mwhQ">|</span> <span class="o" id="mwhg">@</span><span class="nc" id="mwhw">Int_vt</span><span class="o" id="mwiA">(</span><span class="n" id="mwiQ">i</span><span class="o" id="mwig">)</span> <span class="o" id="mwiw">=></span> <span class="k" id="mwjA">begin</span> <span class="o" id="mwjQ">$</span><span class="n" id="mwjg">extfcall</span><span class="o" id="mwjw">(</span><span class="n" id="mwkA">void</span><span class="o" id="mwkQ">,</span> <span class="s2" id="mwkg">"fprintf"</span><span class="o" id="mwkw">,</span> <span class="n" id="mwlA">stdout_ref</span><span class="o" id="mwlQ">,</span> <span class="s2" id="mwlg">"%d</span><span class="se" id="mwlw">\n</span><span class="s2" id="mwmA">"</span><span class="o" id="mwmQ">,</span> <span class="n" id="mwmg">i</span><span class="o" id="mwmw">);</span> <span class="n" id="mwnA">free</span><span class="o" id="mwnQ">@</span><span class="n" id="mwng">i_or_s</span><span class="o" id="mwnw">;</span> <span class="k" id="mwoA">end</span> <span class="n" id="mwoQ">implement</span> <span class="n" id="mwog">main0</span> <span class="bp" id="mwow">()</span><span class="o" id="mwpA">:</span> <span class="n" id="mwpQ">void</span> <span class="o" id="mwpg">=</span> <span class="k" id="mwpw">let</span> <span class="k" id="mwqA">val</span> <span class="n" id="mwqQ">string_hello_world</span> <span class="o" id="mwqg">=</span> <span class="nc" id="mwqw">String_vt</span> <span class="s2" id="mwrA">"Hello, world!"</span> <span class="k" id="mwrQ">val</span> <span class="n" id="mwrg">int_0</span> <span class="o" id="mwrw">=</span> <span class="nc" id="mwsA">Int_vt</span> <span class="mi" id="mwsQ">0</span> <span class="k" id="mwsg">in</span> <span class="n" id="mwsw">print_int_or_string</span> <span class="n" id="mwtA">string_hello_world</span><span class="o" id="mwtQ">;</span> <span class="n" id="mwtg">print_int_or_string</span> <span class="n" id="mwtw">int_0</span><span class="o" id="mwuA">;</span> <span class="c" id="mwuQ">(* which prints:</span> <span class="c" id="mwug"> Hello, world!</span> <span class="c" id="mwuw"> 0</span> <span class="c" id="mwvA"> *)</span> <span class="k" id="mwvQ">end</span>

Ceylon

In Ceylon, an ADT may be defined with:

<span id="mwyA"></span><span class="nd" id="mwyQ">abstract</span><span class="w" id="mwyg"> </span><span class="kd" id="mwyw">class</span><span class="w" id="mwzA"> </span><span class="nf" id="mwzQ">Tree</span><span class="o" id="mwzg">()</span> <span class="w" id="mwzw"> </span><span class="kd" id="mw0A">of</span><span class="w" id="mw0Q"> </span><span class="n" id="mw0g">empty</span><span class="w" id="mw0w"> </span><span class="o" id="mw1A">|</span><span class="w" id="mw1Q"> </span><span class="n" id="mw1g">Node</span><span class="w" id="mw1w"> </span><span class="o" id="mw2A">{}</span> <span class="kd" id="mw2Q">object</span><span class="w" id="mw2g"> </span><span class="nc" id="mw2w">empty</span> <span class="w" id="mw3A"> </span><span class="kd" id="mw3Q">extends</span><span class="w" id="mw3g"> </span><span class="nf" id="mw3w">Tree</span><span class="o" id="mw4A">()</span><span class="w" id="mw4Q"> </span><span class="o" id="mw4g">{}</span> <span class="nd" id="mw4w">final</span><span class="w" id="mw5A"> </span><span class="kd" id="mw5Q">class</span><span class="w" id="mw5g"> </span><span class="nf" id="mw5w">Node</span><span class="o" id="mw6A">(</span><span class="nd" id="mw6Q">shared</span><span class="w" id="mw6g"> </span><span class="n" id="mw6w">Integer</span><span class="w" id="mw7A"> </span><span class="n" id="mw7Q">val</span><span class="o" id="mw7g">,</span><span class="w" id="mw7w"> </span><span class="nd" id="mw8A">shared</span><span class="w" id="mw8Q"> </span><span class="n" id="mw8g">Tree</span><span class="w" id="mw8w"> </span><span class="n" id="mw9A">left</span><span class="o" id="mw9Q">,</span><span class="w" id="mw9g"> </span><span class="nd" id="mw9w">shared</span><span class="w" id="mw-A"> </span><span class="n" id="mw-Q">Tree</span><span class="w" id="mw-g"> </span><span class="n" id="mw-w">right</span><span class="o" id="mw_A">)</span> <span class="w" id="mw_Q"> </span><span class="kd" id="mw_g">extends</span><span class="w" id="mw_w"> </span><span class="nf" id="mwAQA">Tree</span><span class="o" id="mwAQE">()</span><span class="w" id="mwAQI"> </span><span class="o" id="mwAQM">{}</span>

And instantiated as:

<span id="mwAQc"></span><span class="kt" id="mwAQg">value</span><span class="w" id="mwAQk"> </span><span class="n" id="mwAQo">myTree</span><span class="w" id="mwAQs"> </span><span class="o" id="mwAQw">=</span><span class="w" id="mwAQ0"> </span><span class="n" id="mwAQ4">Node</span><span class="o" id="mwAQ8">(</span><span class="mi" id="mwARA">42</span><span class="o" id="mwARE">,</span><span class="w" id="mwARI"> </span><span class="n" id="mwARM">Node</span><span class="o" id="mwARQ">(</span><span class="mi" id="mwARU">0</span><span class="o" id="mwARY">,</span><span class="w" id="mwARc"> </span><span class="n" id="mwARg">empty</span><span class="o" id="mwARk">,</span><span class="w" id="mwARo"> </span><span class="n" id="mwARs">empty</span><span class="o" id="mwARw">),</span><span class="w" id="mwAR0"> </span><span class="n" id="mwAR4">empty</span><span class="o" id="mwAR8">);</span>

Clean

In Clean, an ADT may be defined with:

<span id="mwASo"></span><span class="o" id="mwASs">::</span><span class="w" id="mwASw"> </span><span class="nc" id="mwAS0">Tree</span> <span class="w" id="mwAS4"> </span><span class="o" id="mwAS8">=</span><span class="w" id="mwATA"> </span><span class="nc" id="mwATE">Empty</span> <span class="w" id="mwATI"> </span><span class="o" id="mwATM">|</span><span class="w" id="mwATQ"> </span><span class="nc" id="mwATU">Node</span><span class="w" id="mwATY"> </span><span class="nc" id="mwATc">Int</span><span class="w" id="mwATg"> </span><span class="nc" id="mwATk">Tree</span><span class="w" id="mwATo"> </span><span class="nc" id="mwATs">Tree</span>

And instantiated as:

<span id="mwAT8"></span><span class="n" id="mwAUA">myTree</span><span class="w" id="mwAUE"> </span><span class="o" id="mwAUI">=</span><span class="w" id="mwAUM"> </span><span class="nc" id="mwAUQ">Node</span><span class="w" id="mwAUU"> </span><span class="mi" id="mwAUY">42</span><span class="w" id="mwAUc"> </span><span class="p" id="mwAUg">(</span><span class="nc" id="mwAUk">Node</span><span class="w" id="mwAUo"> </span><span class="mi" id="mwAUs">0</span><span class="w" id="mwAUw"> </span><span class="nc" id="mwAU0">Empty</span><span class="w" id="mwAU4"> </span><span class="nc" id="mwAU8">Empty</span><span class="p" id="mwAVA">)</span><span class="w" id="mwAVE"> </span><span class="nc" id="mwAVI">Empty</span>

C++

In C++, an ADT may be defined with:

<span id="mwAV0"></span><span class="k" id="mwAV4">struct</span><span class="w" id="mwAV8"> </span><span class="nc" id="mwAWA">Empty</span><span class="w" id="mwAWE"> </span><span class="k" id="mwAWI">final</span><span class="w" id="mwAWM"> </span><span class="p" id="mwAWQ">{};</span> <span class="k" id="mwAWU">struct</span><span class="w" id="mwAWY"> </span><span class="nc" id="mwAWc">Node</span><span class="w" id="mwAWg"> </span><span class="k" id="mwAWk">final</span><span class="w" id="mwAWo"> </span><span class="p" id="mwAWs">{</span> <span class="w" id="mwAWw"> </span><span class="kt" id="mwAW0">int</span><span class="w" id="mwAW4"> </span><span class="n" id="mwAW8">value</span><span class="p" id="mwAXA">;</span> <span class="w" id="mwAXE"> </span><span class="n" id="mwAXI">std</span><span class="o" id="mwAXM">::</span><span class="n" id="mwAXQ">unique_ptr</span><span class="o" id="mwAXU"><</span><span class="n" id="mwAXY">std</span><span class="o" id="mwAXc">::</span><span class="n" id="mwAXg">variant</span><span class="o" id="mwAXk"><</span><span class="n" id="mwAXo">Empty</span><span class="p" id="mwAXs">,</span><span class="w" id="mwAXw"> </span><span class="n" id="mwAX0">Node</span><span class="o" id="mwAX4">>></span><span class="w" id="mwAX8"> </span><span class="n" id="mwAYA">left</span><span class="p" id="mwAYE">;</span> <span class="w" id="mwAYI"> </span><span class="n" id="mwAYM">std</span><span class="o" id="mwAYQ">::</span><span class="n" id="mwAYU">unique_ptr</span><span class="o" id="mwAYY"><</span><span class="n" id="mwAYc">std</span><span class="o" id="mwAYg">::</span><span class="n" id="mwAYk">variant</span><span class="o" id="mwAYo"><</span><span class="n" id="mwAYs">Empty</span><span class="p" id="mwAYw">,</span><span class="w" id="mwAY0"> </span><span class="n" id="mwAY4">Node</span><span class="o" id="mwAY8">>></span><span class="w" id="mwAZA"> </span><span class="n" id="mwAZE">right</span><span class="p" id="mwAZI">;</span> <span class="p" id="mwAZM">};</span> <span class="k" id="mwAZQ">using</span><span class="w" id="mwAZU"> </span><span class="n" id="mwAZY">Tree</span><span class="w" id="mwAZc"> </span><span class="o" id="mwAZg">=</span><span class="w" id="mwAZk"> </span><span class="n" id="mwAZo">std</span><span class="o" id="mwAZs">::</span><span class="n" id="mwAZw">variant</span><span class="o" id="mwAZ0"><</span><span class="n" id="mwAZ4">Empty</span><span class="p" id="mwAZ8">,</span><span class="w" id="mwAaA"> </span><span class="n" id="mwAaE">Node</span><span class="o" id="mwAaI">></span><span class="p" id="mwAaM">;</span>

And instantiated as:

<span id="mwAac"></span><span class="n" id="mwAag">Tree</span><span class="w" id="mwAak"> </span><span class="n" id="mwAao">myTree</span><span class="w" id="mwAas"> </span><span class="p" id="mwAaw">{</span><span class="w" id="mwAa0"> </span><span class="n" id="mwAa4">Node</span><span class="p" id="mwAa8">{</span> <span class="w" id="mwAbA"> </span><span class="mi" id="mwAbE">42</span><span class="p" id="mwAbI">,</span> <span class="w" id="mwAbM"> </span><span class="n" id="mwAbQ">std</span><span class="o" id="mwAbU">::</span><span class="n" id="mwAbY">make_unique</span><span class="o" id="mwAbc"><</span><span class="n" id="mwAbg">Tree</span><span class="o" id="mwAbk">></span><span class="p" id="mwAbo">(</span><span class="n" id="mwAbs">Node</span><span class="p" id="mwAbw">{</span> <span class="w" id="mwAb0"> </span><span class="mi" id="mwAb4">0</span><span class="p" id="mwAb8">,</span> <span class="w" id="mwAcA"> </span><span class="n" id="mwAcE">std</span><span class="o" id="mwAcI">::</span><span class="n" id="mwAcM">make_unique</span><span class="o" id="mwAcQ"><</span><span class="n" id="mwAcU">Tree</span><span class="o" id="mwAcY">></span><span class="p" id="mwAcc">(),</span> <span class="w" id="mwAcg"> </span><span class="n" id="mwAck">std</span><span class="o" id="mwAco">::</span><span class="n" id="mwAcs">make_unique</span><span class="o" id="mwAcw"><</span><span class="n" id="mwAc0">Tree</span><span class="o" id="mwAc4">></span><span class="p" id="mwAc8">()</span> <span class="w" id="mwAdA"> </span><span class="p" id="mwAdE">}),</span> <span class="w" id="mwAdI"> </span><span class="n" id="mwAdM">std</span><span class="o" id="mwAdQ">::</span><span class="n" id="mwAdU">make_unique</span><span class="o" id="mwAdY"><</span><span class="n" id="mwAdc">Tree</span><span class="o" id="mwAdg">></span><span class="p" id="mwAdk">()</span> <span class="p" id="mwAdo">}</span><span class="w" id="mwAds"> </span><span class="p" id="mwAdw">};</span>

Dart

In Dart, an ADT may be defined with:

<span id="mwAec"></span><span class="n" id="mwAeg">sealed</span><span class="w" id="mwAek"> </span><span class="kd" id="mwAeo">class</span><span class="w" id="mwAes"> </span><span class="nc" id="mwAew">Tree</span><span class="w" id="mwAe0"> </span><span class="p" id="mwAe4">{}</span> <span class="kd" id="mwAe8">final</span><span class="w" id="mwAfA"> </span><span class="kd" id="mwAfE">class</span><span class="w" id="mwAfI"> </span><span class="nc" id="mwAfM">Empty</span><span class="w" id="mwAfQ"> </span><span class="kd" id="mwAfU">extends</span><span class="w" id="mwAfY"> </span><span class="n" id="mwAfc">Tree</span><span class="w" id="mwAfg"> </span><span class="p" id="mwAfk">{}</span> <span class="kd" id="mwAfo">final</span><span class="w" id="mwAfs"> </span><span class="kd" id="mwAfw">class</span><span class="w" id="mwAf0"> </span><span class="nc" id="mwAf4">Node</span><span class="w" id="mwAf8"> </span><span class="kd" id="mwAgA">extends</span><span class="w" id="mwAgE"> </span><span class="n" id="mwAgI">Tree</span><span class="w" id="mwAgM"> </span><span class="p" id="mwAgQ">{</span> <span class="w" id="mwAgU"> </span><span class="kd" id="mwAgY">final</span><span class="w" id="mwAgc"> </span><span class="kt" id="mwAgg">int</span><span class="w" id="mwAgk"> </span><span class="n" id="mwAgo">value</span><span class="p" id="mwAgs">;</span> <span class="w" id="mwAgw"> </span><span class="kd" id="mwAg0">final</span><span class="w" id="mwAg4"> </span><span class="n" id="mwAg8">Tree</span><span class="w" id="mwAhA"> </span><span class="n" id="mwAhE">left</span><span class="p" id="mwAhI">,</span><span class="w" id="mwAhM"> </span><span class="n" id="mwAhQ">right</span><span class="p" id="mwAhU">;</span> <span class="w" id="mwAhY"> </span><span class="n" id="mwAhc">Node</span><span class="p" id="mwAhg">(</span><span class="k" id="mwAhk">this</span><span class="p" id="mwAho">.</span><span class="n" id="mwAhs">value</span><span class="p" id="mwAhw">,</span><span class="w" id="mwAh0"> </span><span class="k" id="mwAh4">this</span><span class="p" id="mwAh8">.</span><span class="n" id="mwAiA">left</span><span class="p" id="mwAiE">,</span><span class="w" id="mwAiI"> </span><span class="k" id="mwAiM">this</span><span class="p" id="mwAiQ">.</span><span class="n" id="mwAiU">right</span><span class="p" id="mwAiY">);</span> <span class="p" id="mwAic">}</span>

And instantiated as:

<span id="mwAis"></span><span class="kd" id="mwAiw">final</span><span class="w" id="mwAi0"> </span><span class="n" id="mwAi4">myTree</span><span class="w" id="mwAi8"> </span><span class="o" id="mwAjA">=</span><span class="w" id="mwAjE"> </span><span class="n" id="mwAjI">Node</span><span class="p" id="mwAjM">(</span><span class="m" id="mwAjQ">42</span><span class="p" id="mwAjU">,</span><span class="w" id="mwAjY"> </span><span class="n" id="mwAjc">Node</span><span class="p" id="mwAjg">(</span><span class="m" id="mwAjk">0</span><span class="p" id="mwAjo">,</span><span class="w" id="mwAjs"> </span><span class="n" id="mwAjw">Empty</span><span class="p" id="mwAj0">(),</span><span class="w" id="mwAj4"> </span><span class="n" id="mwAj8">Empty</span><span class="p" id="mwAkA">()),</span><span class="w" id="mwAkE"> </span><span class="n" id="mwAkI">Empty</span><span class="p" id="mwAkM">());</span>

Elm

In Elm, an ADT may be defined with:

<span id="mwAk4"></span><span class="kr" id="mwAk8">type</span><span class="w" id="mwAlA"> </span><span class="kt" id="mwAlE">Tree</span> <span class="w" id="mwAlI"> </span><span class="nf" id="mwAlM">=</span><span class="w" id="mwAlQ"> </span><span class="kt" id="mwAlU">Empty</span> <span class="w" id="mwAlY"> </span><span class="nf" id="mwAlc">|</span><span class="w" id="mwAlg"> </span><span class="kt" id="mwAlk">Node</span><span class="w" id="mwAlo"> </span><span class="kt" id="mwAls">Int</span><span class="w" id="mwAlw"> </span><span class="kt" id="mwAl0">Tree</span><span class="w" id="mwAl4"> </span><span class="kt" id="mwAl8">Tree</span>

And instantiated as:

<span id="mwAmM"></span><span class="nv" id="mwAmQ">myTree</span><span class="w" id="mwAmU"> </span><span class="nf" id="mwAmY">=</span><span class="w" id="mwAmc"> </span><span class="kt" id="mwAmg">Node</span><span class="w" id="mwAmk"> </span><span class="mi" id="mwAmo">42</span><span class="w" id="mwAms"> </span><span class="p" id="mwAmw">(</span><span class="kt" id="mwAm0">Node</span><span class="w" id="mwAm4"> </span><span class="mi" id="mwAm8">0</span><span class="w" id="mwAnA"> </span><span class="kt" id="mwAnE">Empty</span><span class="w" id="mwAnI"> </span><span class="kt" id="mwAnM">Empty</span><span class="p" id="mwAnQ">)</span><span class="w" id="mwAnU"> </span><span class="kt" id="mwAnY">Empty</span>

F#

In F#, an ADT may be defined with:

<span id="mwAoE"></span><span class="k" id="mwAoI">type</span><span class="w" id="mwAoM"> </span><span class="nc" id="mwAoQ">Tree</span><span class="w" id="mwAoU"> </span><span class="o" id="mwAoY">=</span> <span class="w" id="mwAoc"> </span><span class="o" id="mwAog">|</span><span class="w" id="mwAok"> </span><span class="n" id="mwAoo">Empty</span> <span class="w" id="mwAos"> </span><span class="o" id="mwAow">|</span><span class="w" id="mwAo0"> </span><span class="n" id="mwAo4">Node</span><span class="w" id="mwAo8"> </span><span class="k" id="mwApA">of</span><span class="w" id="mwApE"> </span><span class="n" id="mwApI">int</span><span class="w" id="mwApM"> </span><span class="o" id="mwApQ">*</span><span class="w" id="mwApU"> </span><span class="n" id="mwApY">Tree</span><span class="w" id="mwApc"> </span><span class="o" id="mwApg">*</span><span class="w" id="mwApk"> </span><span class="n" id="mwApo">Tree</span>

And instantiated as:

<span id="mwAp4"></span><span class="k" id="mwAp8">let</span><span class="w" id="mwAqA"> </span><span class="nv" id="mwAqE">myTree</span><span class="w" id="mwAqI"> </span><span class="o" id="mwAqM">=</span><span class="w" id="mwAqQ"> </span><span class="n" id="mwAqU">Node</span><span class="o" id="mwAqY">(</span><span class="mi" id="mwAqc">42</span><span class="o" id="mwAqg">,</span><span class="w" id="mwAqk"> </span><span class="n" id="mwAqo">Node</span><span class="o" id="mwAqs">(</span><span class="mi" id="mwAqw">0</span><span class="o" id="mwAq0">,</span><span class="w" id="mwAq4"> </span><span class="n" id="mwAq8">Empty</span><span class="o" id="mwArA">,</span><span class="w" id="mwArE"> </span><span class="n" id="mwArI">Empty</span><span class="o" id="mwArM">),</span><span class="w" id="mwArQ"> </span><span class="n" id="mwArU">Empty</span><span class="o" id="mwArY">)</span>

F*

In F*, an ADT may be defined with:

<span id="mwAsE"></span><span class="k" id="mwAsI">type</span> <span class="n" id="mwAsM">tree</span> <span class="o" id="mwAsQ">=</span> <span class="o" id="mwAsU">|</span> <span class="nc" id="mwAsY">Empty</span> <span class="o" id="mwAsc">:</span> <span class="n" id="mwAsg">tree</span> <span class="o" id="mwAsk">|</span> <span class="nc" id="mwAso">Node</span> <span class="o" id="mwAss">:</span> <span class="n" id="mwAsw">value</span><span class="o" id="mwAs0">:</span><span class="n" id="mwAs4">nat</span> <span class="o" id="mwAs8">-></span> <span class="n" id="mwAtA">left</span><span class="o" id="mwAtE">:</span><span class="n" id="mwAtI">tree</span> <span class="o" id="mwAtM">-></span> <span class="n" id="mwAtQ">right</span><span class="o" id="mwAtU">:</span><span class="n" id="mwAtY">tree</span> <span class="o" id="mwAtc">-></span> <span class="n" id="mwAtg">tree</span>

And instantiated as:

<span id="mwAtw"></span><span class="kd" id="mwAt0">let</span> <span class="n" id="mwAt4">my_tree</span> <span class="o" id="mwAt8">=</span> <span class="nc" id="mwAuA">Node</span> <span class="mi" id="mwAuE">42</span> <span class="o" id="mwAuI">(</span><span class="nc" id="mwAuM">Node</span> <span class="mi" id="mwAuQ">0</span> <span class="nc" id="mwAuU">Empty</span> <span class="nc" id="mwAuY">Empty</span><span class="o" id="mwAuc">)</span> <span class="nc" id="mwAug">Empty</span>

Free Pascal

In Free Pascal (in standard ISO Pascal mode), an ADT may be defined with variant records:

<span id="mwAvc"></span><span class="cm" id="mwAvg">{$mode ISO}</span> <span class="k" id="mwAvk">program</span><span class="w" id="mwAvo"> </span><span class="n" id="mwAvs">MakeTree</span><span class="o" id="mwAvw">;</span> <span class="k" id="mwAv0">type</span><span class="w" id="mwAv4"> </span><span class="n" id="mwAv8">TreeKind</span><span class="w" id="mwAwA"> </span><span class="o" id="mwAwE">=</span><span class="w" id="mwAwI"> </span><span class="p" id="mwAwM">(</span><span class="n" id="mwAwQ">Empty</span><span class="o" id="mwAwU">,</span><span class="w" id="mwAwY"> </span><span class="n" id="mwAwc">Node</span><span class="p" id="mwAwg">)</span><span class="o" id="mwAwk">;</span> <span class="w" id="mwAwo"> </span><span class="n" id="mwAws">PTree</span><span class="w" id="mwAww"> </span><span class="o" id="mwAw0">=</span><span class="w" id="mwAw4"> </span><span class="o" id="mwAw8">^</span><span class="n" id="mwAxA">Tree</span><span class="o" id="mwAxE">;</span> <span class="w" id="mwAxI"> </span><span class="n" id="mwAxM">Tree</span><span class="w" id="mwAxQ"> </span><span class="o" id="mwAxU">=</span><span class="w" id="mwAxY"> </span><span class="k" id="mwAxc">record</span> <span class="w" id="mwAxg"> </span><span class="k" id="mwAxk">case</span><span class="w" id="mwAxo"> </span><span class="n" id="mwAxs">Kind</span><span class="o" id="mwAxw">:</span><span class="w" id="mwAx0"> </span><span class="n" id="mwAx4">TreeKind</span><span class="w" id="mwAx8"> </span><span class="k" id="mwAyA">of</span> <span class="w" id="mwAyE"> </span><span class="n" id="mwAyI">Empty</span><span class="o" id="mwAyM">:</span><span class="w" id="mwAyQ"> </span><span class="p" id="mwAyU">()</span><span class="o" id="mwAyY">;</span> <span class="w" id="mwAyc"> </span><span class="n" id="mwAyg">Node</span><span class="o" id="mwAyk">:</span><span class="w" id="mwAyo"> </span><span class="p" id="mwAys">(</span> <span class="w" id="mwAyw"> </span><span class="n" id="mwAy0">Value</span><span class="o" id="mwAy4">:</span><span class="w" id="mwAy8"> </span><span class="kt" id="mwAzA">Integer</span><span class="o" id="mwAzE">;</span> <span class="w" id="mwAzI"> </span><span class="n" id="mwAzM">Left</span><span class="o" id="mwAzQ">,</span><span class="w" id="mwAzU"> </span><span class="n" id="mwAzY">Right</span><span class="o" id="mwAzc">:</span><span class="w" id="mwAzg"> </span><span class="n" id="mwAzk">PTree</span><span class="o" id="mwAzo">;</span> <span class="w" id="mwAzs"> </span><span class="p" id="mwAzw">)</span><span class="o" id="mwAz0">;</span> <span class="w" id="mwAz4"> </span><span class="k" id="mwAz8">end</span><span class="o" id="mwA0A">;</span>

And instantiated as:

<span id="mwA0Q"></span><span class="k" id="mwA0U">var</span><span class="w" id="mwA0Y"> </span><span class="n" id="mwA0c">MyTree</span><span class="o" id="mwA0g">:</span><span class="w" id="mwA0k"> </span><span class="n" id="mwA0o">PTree</span><span class="o" id="mwA0s">;</span> <span class="k" id="mwA0w">begin</span><span class="w" id="mwA00"> </span><span class="k" id="mwA04">new</span><span class="p" id="mwA08">(</span><span class="n" id="mwA1A">MyTree</span><span class="o" id="mwA1E">,</span><span class="w" id="mwA1I"> </span><span class="n" id="mwA1M">Node</span><span class="p" id="mwA1Q">)</span><span class="o" id="mwA1U">;</span> <span class="w" id="mwA1Y"> </span><span class="k" id="mwA1c">with</span><span class="w" id="mwA1g"> </span><span class="n" id="mwA1k">MyTree</span><span class="o" id="mwA1o">^</span><span class="w" id="mwA1s"> </span><span class="k" id="mwA1w">do</span><span class="w" id="mwA10"> </span><span class="k" id="mwA14">begin</span> <span class="w" id="mwA18"> </span><span class="n" id="mwA2A">Value</span><span class="w" id="mwA2E"> </span><span class="o" id="mwA2I">:=</span><span class="w" id="mwA2M"> </span><span class="mi" id="mwA2Q">42</span><span class="o" id="mwA2U">;</span> <span class="w" id="mwA2Y"> </span><span class="k" id="mwA2c">new</span><span class="p" id="mwA2g">(</span><span class="n" id="mwA2k">Left</span><span class="o" id="mwA2o">,</span><span class="w" id="mwA2s"> </span><span class="n" id="mwA2w">Node</span><span class="p" id="mwA20">)</span><span class="o" id="mwA24">;</span> <span class="w" id="mwA28"> </span><span class="k" id="mwA3A">with</span><span class="w" id="mwA3E"> </span><span class="n" id="mwA3I">Left</span><span class="o" id="mwA3M">^</span><span class="w" id="mwA3Q"> </span><span class="k" id="mwA3U">do</span><span class="w" id="mwA3Y"> </span><span class="k" id="mwA3c">begin</span> <span class="w" id="mwA3g"> </span><span class="n" id="mwA3k">Value</span><span class="w" id="mwA3o"> </span><span class="o" id="mwA3s">:=</span><span class="w" id="mwA3w"> </span><span class="mi" id="mwA30">0</span><span class="o" id="mwA34">;</span> <span class="w" id="mwA38"> </span><span class="k" id="mwA4A">new</span><span class="p" id="mwA4E">(</span><span class="n" id="mwA4I">Left</span><span class="o" id="mwA4M">,</span><span class="w" id="mwA4Q"> </span><span class="n" id="mwA4U">Empty</span><span class="p" id="mwA4Y">)</span><span class="o" id="mwA4c">;</span> <span class="w" id="mwA4g"> </span><span class="k" id="mwA4k">new</span><span class="p" id="mwA4o">(</span><span class="n" id="mwA4s">Right</span><span class="o" id="mwA4w">,</span><span class="w" id="mwA40"> </span><span class="n" id="mwA44">Empty</span><span class="p" id="mwA48">)</span><span class="o" id="mwA5A">;</span> <span class="w" id="mwA5E"> </span><span class="k" id="mwA5I">end</span><span class="o" id="mwA5M">;</span> <span class="w" id="mwA5Q"> </span><span class="k" id="mwA5U">new</span><span class="p" id="mwA5Y">(</span><span class="n" id="mwA5c">Right</span><span class="o" id="mwA5g">,</span><span class="w" id="mwA5k"> </span><span class="n" id="mwA5o">Empty</span><span class="p" id="mwA5s">)</span><span class="o" id="mwA5w">;</span> <span class="w" id="mwA50"> </span><span class="k" id="mwA54">end</span><span class="o" id="mwA58">;</span> <span class="k" id="mwA6A">end</span><span class="o" id="mwA6E">.</span>

Haskell

In Haskell, an ADT may be defined with:

<span id="mwA6w"></span><span class="kr" id="mwA60">data</span><span class="w" id="mwA64"> </span><span class="kt" id="mwA68">Tree</span> <span class="w" id="mwA7A"> </span><span class="ow" id="mwA7E">=</span><span class="w" id="mwA7I"> </span><span class="kt" id="mwA7M">Empty</span> <span class="w" id="mwA7Q"> </span><span class="o" id="mwA7U">|</span><span class="w" id="mwA7Y"> </span><span class="kt" id="mwA7c">Node</span><span class="w" id="mwA7g"> </span><span class="kt" id="mwA7k">Int</span><span class="w" id="mwA7o"> </span><span class="kt" id="mwA7s">Tree</span><span class="w" id="mwA7w"> </span><span class="kt" id="mwA70">Tree</span>

And instantiated as:

<span id="mwA8E"></span><span class="nf" id="mwA8I">myTree</span><span class="w" id="mwA8M"> </span><span class="ow" id="mwA8Q">=</span><span class="w" id="mwA8U"> </span><span class="kt" id="mwA8Y">Node</span><span class="w" id="mwA8c"> </span><span class="mi" id="mwA8g">42</span><span class="w" id="mwA8k"> </span><span class="p" id="mwA8o">(</span><span class="kt" id="mwA8s">Node</span><span class="w" id="mwA8w"> </span><span class="mi" id="mwA80">0</span><span class="w" id="mwA84"> </span><span class="kt" id="mwA88">Empty</span><span class="w" id="mwA9A"> </span><span class="kt" id="mwA9E">Empty</span><span class="p" id="mwA9I">)</span><span class="w" id="mwA9M"> </span><span class="kt" id="mwA9Q">Empty</span>

Haxe

In Haxe, an ADT may be defined with:

<span id="mwA98"></span><span class="kd" id="mwA-A">enum</span><span class="w" id="mwA-E"> </span><span class="n" id="mwA-I">Tree</span><span class="w" id="mwA-M"> </span><span class="p" id="mwA-Q">{</span> <span class="w" id="mwA-U"> </span><span class="n" id="mwA-Y">Empty</span><span class="p" id="mwA-c">;</span> <span class="w" id="mwA-g"> </span><span class="n" id="mwA-k">Node</span><span class="p" id="mwA-o">(</span><span class="n" id="mwA-s">value</span><span class="p" id="mwA-w">:</span><span class="n" id="mwA-0">Int</span><span class="p" id="mwA-4">,</span><span class="w" id="mwA-8"> </span><span class="n" id="mwA_A">left</span><span class="p" id="mwA_E">:</span><span class="n" id="mwA_I">Tree</span><span class="p" id="mwA_M">,</span><span class="w" id="mwA_Q"> </span><span class="n" id="mwA_U">right</span><span class="p" id="mwA_Y">:</span><span class="n" id="mwA_c">Tree</span><span class="p" id="mwA_g">);</span> <span class="p" id="mwA_k">}</span>

And instantiated as:

<span id="mwA_0"></span><span class="kd" id="mwA_4">var</span><span class="w" id="mwA_8"> </span>myTree<span class="w" id="mwBAA"> </span><span class="o" id="mwBAE">=</span><span class="w" id="mwBAI"> </span><span class="n" id="mwBAM">Node</span><span class="p" id="mwBAQ">(</span><span class="mi" id="mwBAU">42</span><span class="p" id="mwBAY">,</span><span class="w" id="mwBAc"> </span><span class="n" id="mwBAg">Node</span><span class="p" id="mwBAk">(</span><span class="mi" id="mwBAo">0</span><span class="p" id="mwBAs">,</span><span class="w" id="mwBAw"> </span><span class="n" id="mwBA0">Empty</span><span class="p" id="mwBA4">,</span><span class="w" id="mwBA8"> </span><span class="n" id="mwBBA">Empty</span><span class="p" id="mwBBE">),</span><span class="w" id="mwBBI"> </span><span class="n" id="mwBBM">Empty</span><span class="p" id="mwBBQ">);</span>

Hope

In Hope, an ADT may be defined with:

<span id="mwBB8"></span><span class="kr" id="mwBCA">data</span><span class="w" id="mwBCE"> </span><span class="n" id="mwBCI">tree</span><span class="w" id="mwBCM"> </span><span class="o" id="mwBCQ">==</span><span class="w" id="mwBCU"> </span><span class="n" id="mwBCY">empty</span> <span class="w" id="mwBCc"> </span><span class="o" id="mwBCg">++</span><span class="w" id="mwBCk"> </span><span class="n" id="mwBCo">node</span><span class="w" id="mwBCs"> </span><span class="p" id="mwBCw">(</span><span class="n" id="mwBC0">num</span><span class="w" id="mwBC4"> </span><span class="o" id="mwBC8">#</span><span class="w" id="mwBDA"> </span><span class="n" id="mwBDE">tree</span><span class="w" id="mwBDI"> </span><span class="o" id="mwBDM">#</span><span class="w" id="mwBDQ"> </span><span class="n" id="mwBDU">tree</span><span class="p" id="mwBDY">);</span>

And instantiated as:

<span id="mwBDo"></span>dec mytree : tree; --- mytree <= node (42, node (0, empty, empty), empty);

Idris

In Idris, an ADT may be defined with:

<span id="mwBEU"></span><span class="kr" id="mwBEY">data</span><span class="w" id="mwBEc"> </span><span class="kt" id="mwBEg">Tree</span> <span class="w" id="mwBEk"> </span><span class="ow" id="mwBEo">=</span><span class="w" id="mwBEs"> </span><span class="kt" id="mwBEw">Empty</span> <span class="w" id="mwBE0"> </span><span class="ow" id="mwBE4">|</span><span class="w" id="mwBE8"> </span><span class="kt" id="mwBFA">Node</span><span class="w" id="mwBFE"> </span><span class="kt" id="mwBFI">Nat</span><span class="w" id="mwBFM"> </span><span class="kt" id="mwBFQ">Tree</span><span class="w" id="mwBFU"> </span><span class="kt" id="mwBFY">Tree</span>

And instantiated as:

<span id="mwBFo"></span><span class="nf" id="mwBFs">myTree</span><span class="w" id="mwBFw"> </span><span class="ow" id="mwBF0">:</span><span class="w" id="mwBF4"> </span><span class="kt" id="mwBF8">Tree</span> myTree<span class="w" id="mwBGA"> </span><span class="ow" id="mwBGE">=</span><span class="w" id="mwBGI"> </span><span class="kt" id="mwBGM">Node</span><span class="w" id="mwBGQ"> </span><span class="mi" id="mwBGU">42</span><span class="w" id="mwBGY"> </span><span class="ow" id="mwBGc">(</span><span class="kt" id="mwBGg">Node</span><span class="w" id="mwBGk"> </span><span class="mi" id="mwBGo">0</span><span class="w" id="mwBGs"> </span><span class="kt" id="mwBGw">Empty</span><span class="w" id="mwBG0"> </span><span class="kt" id="mwBG4">Empty</span><span class="ow" id="mwBG8">)</span><span class="w" id="mwBHA"> </span><span class="kt" id="mwBHE">Empty</span>

Java

In Java, an ADT may be defined with:

<span id="mwBHw"></span><span class="kd" id="mwBH0">sealed</span><span class="w" id="mwBH4"> </span><span class="kd" id="mwBH8">interface</span> <span class="nc" id="mwBIA">Tree</span><span class="w" id="mwBIE"> </span><span class="p" id="mwBII">{</span> <span class="w" id="mwBIM"> </span><span class="kd" id="mwBIQ">record</span> <span class="nc" id="mwBIU">Empty</span><span class="p" id="mwBIY">()</span><span class="w" id="mwBIc"> </span><span class="kd" id="mwBIg">implements</span><span class="w" id="mwBIk"> </span><span class="n" id="mwBIo">Tree</span><span class="w" id="mwBIs"> </span><span class="p" id="mwBIw">{}</span> <span class="w" id="mwBI0"> </span><span class="kd" id="mwBI4">record</span> <span class="nc" id="mwBI8">Node</span><span class="p" id="mwBJA">(</span><span class="kt" id="mwBJE">int</span><span class="w" id="mwBJI"> </span><span class="n" id="mwBJM">value</span><span class="p" id="mwBJQ">,</span><span class="w" id="mwBJU"> </span><span class="n" id="mwBJY">Tree</span><span class="w" id="mwBJc"> </span><span class="n" id="mwBJg">left</span><span class="p" id="mwBJk">,</span><span class="w" id="mwBJo"> </span><span class="n" id="mwBJs">Tree</span><span class="w" id="mwBJw"> </span><span class="n" id="mwBJ0">right</span><span class="p" id="mwBJ4">)</span><span class="w" id="mwBJ8"> </span><span class="kd" id="mwBKA">implements</span><span class="w" id="mwBKE"> </span><span class="n" id="mwBKI">Tree</span><span class="w" id="mwBKM"> </span><span class="p" id="mwBKQ">{}</span> <span class="p" id="mwBKU">}</span>

And instantiated as:

<span id="mwBKk"></span><span class="kd" id="mwBKo">var</span><span class="w" id="mwBKs"> </span><span class="n" id="mwBKw">myTree</span><span class="w" id="mwBK0"> </span><span class="o" id="mwBK4">=</span><span class="w" id="mwBK8"> </span><span class="k" id="mwBLA">new</span><span class="w" id="mwBLE"> </span><span class="n" id="mwBLI">Tree</span><span class="p" id="mwBLM">.</span><span class="na" id="mwBLQ">Node</span><span class="p" id="mwBLU">(</span> <span class="w" id="mwBLY"> </span><span class="mi" id="mwBLc">42</span><span class="p" id="mwBLg">,</span> <span class="w" id="mwBLk"> </span><span class="k" id="mwBLo">new</span><span class="w" id="mwBLs"> </span><span class="n" id="mwBLw">Tree</span><span class="p" id="mwBL0">.</span><span class="na" id="mwBL4">Node</span><span class="p" id="mwBL8">(</span><span class="mi" id="mwBMA">0</span><span class="p" id="mwBME">,</span><span class="w" id="mwBMI"> </span><span class="k" id="mwBMM">new</span><span class="w" id="mwBMQ"> </span><span class="n" id="mwBMU">Tree</span><span class="p" id="mwBMY">.</span><span class="na" id="mwBMc">Empty</span><span class="p" id="mwBMg">(),</span><span class="w" id="mwBMk"> </span><span class="k" id="mwBMo">new</span><span class="w" id="mwBMs"> </span><span class="n" id="mwBMw">Tree</span><span class="p" id="mwBM0">.</span><span class="na" id="mwBM4">Empty</span><span class="p" id="mwBM8">()),</span> <span class="w" id="mwBNA"> </span><span class="k" id="mwBNE">new</span><span class="w" id="mwBNI"> </span><span class="n" id="mwBNM">Tree</span><span class="p" id="mwBNQ">.</span><span class="na" id="mwBNU">Empty</span><span class="p" id="mwBNY">()</span> <span class="p" id="mwBNc">);</span>

Julia

In Julia, an ADT may be defined with:

<span id="mwBOI"></span><span class="k" id="mwBOM">struct</span> <span class="kt" id="mwBOQ">Empty</span> <span class="k" id="mwBOU">end</span> <span class="k" id="mwBOY">struct</span> <span class="kt" id="mwBOc">Node</span> <span class="w" id="mwBOg"> </span><span class="n" id="mwBOk">value</span><span class="o" id="mwBOo">::</span><span class="kt" id="mwBOs">Int</span> <span class="w" id="mwBOw"> </span><span class="n" id="mwBO0">left</span><span class="o" id="mwBO4">::</span><span class="kt" id="mwBO8">Union</span><span class="p" id="mwBPA">{</span><span class="kt" id="mwBPE">Empty</span><span class="p" id="mwBPI">,</span><span class="w" id="mwBPM"> </span><span class="kt" id="mwBPQ">Node</span><span class="p" id="mwBPU">}</span> <span class="w" id="mwBPY"> </span><span class="n" id="mwBPc">right</span><span class="o" id="mwBPg">::</span><span class="kt" id="mwBPk">Union</span><span class="p" id="mwBPo">{</span><span class="kt" id="mwBPs">Empty</span><span class="p" id="mwBPw">,</span><span class="w" id="mwBP0"> </span><span class="kt" id="mwBP4">Node</span><span class="p" id="mwBP8">}</span> <span class="k" id="mwBQA">end</span> <span class="k" id="mwBQE">const</span><span class="w" id="mwBQI"> </span><span class="n" id="mwBQM">Tree</span><span class="w" id="mwBQQ"> </span><span class="o" id="mwBQU">=</span><span class="w" id="mwBQY"> </span><span class="kt" id="mwBQc">Union</span><span class="p" id="mwBQg">{</span><span class="kt" id="mwBQk">Empty</span><span class="p" id="mwBQo">,</span><span class="w" id="mwBQs"> </span><span class="kt" id="mwBQw">Node</span><span class="p" id="mwBQ0">}</span>

And instantiated as:

<span id="mwBRE"></span><span class="n" id="mwBRI">mytree</span><span class="w" id="mwBRM"> </span><span class="o" id="mwBRQ">=</span><span class="w" id="mwBRU"> </span><span class="n" id="mwBRY">Node</span><span class="p" id="mwBRc">(</span><span class="mi" id="mwBRg">42</span><span class="p" id="mwBRk">,</span><span class="w" id="mwBRo"> </span><span class="n" id="mwBRs">Node</span><span class="p" id="mwBRw">(</span><span class="mi" id="mwBR0">0</span><span class="p" id="mwBR4">,</span><span class="w" id="mwBR8"> </span><span class="n" id="mwBSA">Empty</span><span class="p" id="mwBSE">(),</span><span class="w" id="mwBSI"> </span><span class="n" id="mwBSM">Empty</span><span class="p" id="mwBSQ">()),</span><span class="w" id="mwBSU"> </span><span class="n" id="mwBSY">Empty</span><span class="p" id="mwBSc">())</span>

Kotlin

In Kotlin, an ADT may be defined with:

<span id="mwBTI"></span><span class="kd" id="mwBTM">sealed</span><span class="w" id="mwBTQ"> </span><span class="kd" id="mwBTU">class</span><span class="w" id="mwBTY"> </span><span class="nc" id="mwBTc">Tree</span><span class="w" id="mwBTg"> </span><span class="p" id="mwBTk">{</span> <span class="w" id="mwBTo"> </span><span class="kd" id="mwBTs">object</span><span class="w" id="mwBTw"> </span><span class="nc" id="mwBT0">Empty</span><span class="w" id="mwBT4"> </span><span class="p" id="mwBT8">:</span><span class="w" id="mwBUA"> </span><span class="n" id="mwBUE">Tree</span><span class="p" id="mwBUI">()</span> <span class="w" id="mwBUM"> </span><span class="kd" id="mwBUQ">data</span><span class="w" id="mwBUU"> </span><span class="kd" id="mwBUY">class</span><span class="w" id="mwBUc"> </span><span class="nc" id="mwBUg">Node</span><span class="p" id="mwBUk">(</span><span class="kd" id="mwBUo">val</span><span class="w" id="mwBUs"> </span><span class="nv" id="mwBUw">value</span><span class="p" id="mwBU0">:</span><span class="w" id="mwBU4"> </span><span class="kt" id="mwBU8">Int</span><span class="p" id="mwBVA">,</span><span class="w" id="mwBVE"> </span><span class="kd" id="mwBVI">val</span><span class="w" id="mwBVM"> </span><span class="nv" id="mwBVQ">left</span><span class="p" id="mwBVU">:</span><span class="w" id="mwBVY"> </span><span class="n" id="mwBVc">Tree</span><span class="p" id="mwBVg">,</span><span class="w" id="mwBVk"> </span><span class="kd" id="mwBVo">val</span><span class="w" id="mwBVs"> </span><span class="nv" id="mwBVw">right</span><span class="p" id="mwBV0">:</span><span class="w" id="mwBV4"> </span><span class="n" id="mwBV8">Tree</span><span class="p" id="mwBWA">)</span><span class="w" id="mwBWE"> </span><span class="p" id="mwBWI">:</span><span class="w" id="mwBWM"> </span><span class="n" id="mwBWQ">Tree</span><span class="p" id="mwBWU">()</span> <span class="p" id="mwBWY">}</span>

And instantiated as:

<span id="mwBWo"></span><span class="kd" id="mwBWs">val</span><span class="w" id="mwBWw"> </span><span class="nv" id="mwBW0">myTree</span><span class="w" id="mwBW4"> </span><span class="o" id="mwBW8">=</span><span class="w" id="mwBXA"> </span><span class="n" id="mwBXE">Tree</span><span class="p" id="mwBXI">.</span><span class="na" id="mwBXM">Node</span><span class="p" id="mwBXQ">(</span> <span class="w" id="mwBXU"> </span><span class="m" id="mwBXY">42</span><span class="p" id="mwBXc">,</span> <span class="w" id="mwBXg"> </span><span class="n" id="mwBXk">Tree</span><span class="p" id="mwBXo">.</span><span class="na" id="mwBXs">Node</span><span class="p" id="mwBXw">(</span><span class="m" id="mwBX0">0</span><span class="p" id="mwBX4">,</span><span class="w" id="mwBX8"> </span><span class="n" id="mwBYA">Tree</span><span class="p" id="mwBYE">.</span><span class="na" id="mwBYI">Empty</span><span class="p" id="mwBYM">,</span><span class="w" id="mwBYQ"> </span><span class="n" id="mwBYU">Tree</span><span class="p" id="mwBYY">.</span><span class="na" id="mwBYc">Empty</span><span class="p" id="mwBYg">),</span> <span class="w" id="mwBYk"> </span><span class="n" id="mwBYo">Tree</span><span class="p" id="mwBYs">.</span><span class="na" id="mwBYw">Empty</span><span class="p" id="mwBY0">,</span> <span class="p" id="mwBY4">)</span>

Limbo

In Limbo, an ADT may be defined with:

<span id="mwBZk"></span><span class="n" id="mwBZo">Tree</span><span class="o" id="mwBZs">:</span><span class="w" id="mwBZw"> </span><span class="kt" id="mwBZ0">adt</span><span class="w" id="mwBZ4"> </span><span class="p" id="mwBZ8">{</span> <span class="w" id="mwBaA"> </span><span class="n" id="mwBaE">pick</span><span class="w" id="mwBaI"> </span><span class="p" id="mwBaM">{</span> <span class="w" id="mwBaQ"> </span><span class="n" id="mwBaU">Empty</span><span class="w" id="mwBaY"> </span><span class="o" id="mwBac">=></span> <span class="w" id="mwBag"> </span><span class="n" id="mwBak">Node</span><span class="w" id="mwBao"> </span><span class="o" id="mwBas">=></span> <span class="w" id="mwBaw"> </span><span class="n" id="mwBa0">value</span><span class="o" id="mwBa4">:</span><span class="w" id="mwBa8"> </span><span class="kt" id="mwBbA">int</span><span class="p" id="mwBbE">;</span> <span class="w" id="mwBbI"> </span><span class="n" id="mwBbM">left</span><span class="o" id="mwBbQ">:</span><span class="w" id="mwBbU"> </span><span class="kt" id="mwBbY">ref</span><span class="w" id="mwBbc"> </span><span class="n" id="mwBbg">Tree</span><span class="p" id="mwBbk">;</span> <span class="w" id="mwBbo"> </span><span class="n" id="mwBbs">right</span><span class="o" id="mwBbw">:</span><span class="w" id="mwBb0"> </span><span class="kt" id="mwBb4">ref</span><span class="w" id="mwBb8"> </span><span class="n" id="mwBcA">Tree</span><span class="p" id="mwBcE">;</span> <span class="w" id="mwBcI"> </span><span class="p" id="mwBcM">}</span> <span class="p" id="mwBcQ">};</span>

And instantiated as:

<span id="mwBcg"></span><span class="n" id="mwBck">myTree</span><span class="w" id="mwBco"> </span><span class="o" id="mwBcs">:=</span><span class="w" id="mwBcw"> </span><span class="kt" id="mwBc0">ref</span><span class="w" id="mwBc4"> </span><span class="n" id="mwBc8">Tree</span><span class="p" id="mwBdA">.</span><span class="n" id="mwBdE">Node</span><span class="p" id="mwBdI">(</span> <span class="w" id="mwBdM"> </span><span class="mi" id="mwBdQ">42</span><span class="p" id="mwBdU">,</span> <span class="w" id="mwBdY"> </span><span class="kt" id="mwBdc">ref</span><span class="w" id="mwBdg"> </span><span class="n" id="mwBdk">Tree</span><span class="p" id="mwBdo">.</span><span class="n" id="mwBds">Node</span><span class="p" id="mwBdw">(</span><span class="mi" id="mwBd0">0</span><span class="p" id="mwBd4">,</span><span class="w" id="mwBd8"> </span><span class="kt" id="mwBeA">ref</span><span class="w" id="mwBeE"> </span><span class="n" id="mwBeI">Tree</span><span class="p" id="mwBeM">.</span><span class="n" id="mwBeQ">Empty</span><span class="p" id="mwBeU">(),</span><span class="w" id="mwBeY"> </span><span class="kt" id="mwBec">ref</span><span class="w" id="mwBeg"> </span><span class="n" id="mwBek">Tree</span><span class="p" id="mwBeo">.</span><span class="n" id="mwBes">Empty</span><span class="p" id="mwBew">()),</span> <span class="w" id="mwBe0"> </span><span class="kt" id="mwBe4">ref</span><span class="w" id="mwBe8"> </span><span class="n" id="mwBfA">Tree</span><span class="p" id="mwBfE">.</span><span class="n" id="mwBfI">Empty</span><span class="p" id="mwBfM">()</span> <span class="p" id="mwBfQ">);</span>

Mercury

In Mercury, an ADT may be defined with:

<span id="mwBf8"></span><span class="p" id="mwBgA">:-</span> <span class="s s-Atom" id="mwBgE">type</span> <span class="s s-Atom" id="mwBgI">tree</span> <span class="s s-Atom" id="mwBgM">---></span> <span class="s s-Atom" id="mwBgQ">empty</span> <span class="p" id="mwBgU">;</span> <span class="nf" id="mwBgY">node</span><span class="p" id="mwBgc">(</span><span class="s s-Atom" id="mwBgg">int</span><span class="p" id="mwBgk">,</span> <span class="s s-Atom" id="mwBgo">tree</span><span class="p" id="mwBgs">,</span> <span class="s s-Atom" id="mwBgw">tree</span><span class="p" id="mwBg0">).</span>

And instantiated as:

<span id="mwBhE"></span><span class="p" id="mwBhI">:-</span> <span class="s s-Atom" id="mwBhM">func</span> <span class="s s-Atom" id="mwBhQ">my_tree</span> <span class="o" id="mwBhU">=</span> <span class="s s-Atom" id="mwBhY">tree</span><span class="p" id="mwBhc">.</span> <span class="s s-Atom" id="mwBhg">my_tree</span> <span class="o" id="mwBhk">=</span> <span class="nf" id="mwBho">node</span><span class="p" id="mwBhs">(</span><span class="mi" id="mwBhw">42</span><span class="p" id="mwBh0">,</span> <span class="nf" id="mwBh4">node</span><span class="p" id="mwBh8">(</span><span class="mi" id="mwBiA">0</span><span class="p" id="mwBiE">,</span> <span class="s s-Atom" id="mwBiI">empty</span><span class="p" id="mwBiM">,</span> <span class="s s-Atom" id="mwBiQ">empty</span><span class="p" id="mwBiU">),</span> <span class="s s-Atom" id="mwBiY">empty</span><span class="p" id="mwBic">).</span>

Miranda

In Miranda, an ADT may be defined with:

<span id="mwBjI"></span><span class="nf" id="mwBjM">tree</span><span class="w" id="mwBjQ"> </span><span class="kt" id="mwBjU">::=</span> <span class="w" id="mwBjY"> </span><span class="kt" id="mwBjc">Empty</span> <span class="w" id="mwBjg"> </span><span class="o" id="mwBjk">|</span><span class="w" id="mwBjo"> </span><span class="kt" id="mwBjs">Node</span><span class="w" id="mwBjw"> </span><span class="n" id="mwBj0">num</span><span class="w" id="mwBj4"> </span><span class="n" id="mwBj8">tree</span><span class="w" id="mwBkA"> </span><span class="n" id="mwBkE">tree</span>

And instantiated as:

<span id="mwBkU"></span><span class="nf" id="mwBkY">my_tree</span><span class="w" id="mwBkc"> </span><span class="ow" id="mwBkg">=</span><span class="w" id="mwBkk"> </span><span class="kt" id="mwBko">Node</span><span class="w" id="mwBks"> </span><span class="mi" id="mwBkw">42</span><span class="w" id="mwBk0"> </span><span class="p" id="mwBk4">(</span><span class="kt" id="mwBk8">Node</span><span class="w" id="mwBlA"> </span><span class="mi" id="mwBlE">0</span><span class="w" id="mwBlI"> </span><span class="kt" id="mwBlM">Empty</span><span class="w" id="mwBlQ"> </span><span class="kt" id="mwBlU">Empty</span><span class="p" id="mwBlY">)</span><span class="w" id="mwBlc"> </span><span class="kt" id="mwBlg">Empty</span>

Nemerle

In Nemerle, an ADT may be defined with:

<span id="mwBmM"></span><span class="k" id="mwBmQ">variant</span><span class="w" id="mwBmU"> </span><span class="nc" id="mwBmY">Tree</span> <span class="p" id="mwBmc">{</span> <span class="w" id="mwBmg"> </span><span class="p" id="mwBmk">|</span><span class="w" id="mwBmo"> </span><span class="n" id="mwBms">Empty</span> <span class="w" id="mwBmw"> </span><span class="p" id="mwBm0">|</span><span class="w" id="mwBm4"> </span><span class="n" id="mwBm8">Node</span><span class="w" id="mwBnA"> </span><span class="p" id="mwBnE">{</span> <span class="w" id="mwBnI"> </span><span class="n" id="mwBnM">value</span><span class="p" id="mwBnQ">:</span><span class="w" id="mwBnU"> </span><span class="kt" id="mwBnY">int</span><span class="p" id="mwBnc">;</span> <span class="w" id="mwBng"> </span><span class="n" id="mwBnk">left</span><span class="p" id="mwBno">:</span><span class="w" id="mwBns"> </span><span class="n" id="mwBnw">Tree</span><span class="p" id="mwBn0">;</span> <span class="w" id="mwBn4"> </span><span class="n" id="mwBn8">right</span><span class="p" id="mwBoA">:</span><span class="w" id="mwBoE"> </span><span class="n" id="mwBoI">Tree</span><span class="p" id="mwBoM">;</span> <span class="w" id="mwBoQ"> </span><span class="p" id="mwBoU">}</span> <span class="p" id="mwBoY">}</span>

And instantiated as:

<span id="mwBoo"></span><span class="k" id="mwBos">def</span><span class="w" id="mwBow"> </span><span class="n" id="mwBo0">myTree</span><span class="w" id="mwBo4"> </span><span class="p" id="mwBo8">=</span><span class="w" id="mwBpA"> </span><span class="n" id="mwBpE">Tree</span><span class="p" id="mwBpI">.</span><span class="n" id="mwBpM">Node</span><span class="p" id="mwBpQ">(</span> <span class="w" id="mwBpU"> </span><span class="m" id="mwBpY">42</span><span class="p" id="mwBpc">,</span> <span class="w" id="mwBpg"> </span><span class="n" id="mwBpk">Tree</span><span class="p" id="mwBpo">.</span><span class="n" id="mwBps">Node</span><span class="p" id="mwBpw">(</span><span class="m" id="mwBp0">0</span><span class="p" id="mwBp4">,</span><span class="w" id="mwBp8"> </span><span class="n" id="mwBqA">Tree</span><span class="p" id="mwBqE">.</span><span class="n" id="mwBqI">Empty</span><span class="p" id="mwBqM">(),</span><span class="w" id="mwBqQ"> </span><span class="n" id="mwBqU">Tree</span><span class="p" id="mwBqY">.</span><span class="n" id="mwBqc">Empty</span><span class="p" id="mwBqg">()),</span> <span class="w" id="mwBqk"> </span><span class="n" id="mwBqo">Tree</span><span class="p" id="mwBqs">.</span><span class="n" id="mwBqw">Empty</span><span class="p" id="mwBq0">(),</span> <span class="p" id="mwBq4">);</span>

Nim

In Nim, an ADT may be defined with:

<span id="mwBrk"></span><span class="k" id="mwBro">type</span> <span class="w" id="mwBrs"> </span><span class="n" id="mwBrw">TreeKind</span><span class="w" id="mwBr0"> </span><span class="o" id="mwBr4">=</span><span class="w" id="mwBr8"> </span><span class="k" id="mwBsA">enum</span> <span class="w" id="mwBsE"> </span><span class="n" id="mwBsI">tkEmpty</span> <span class="w" id="mwBsM"> </span><span class="n" id="mwBsQ">tkNode</span> <span class="w" id="mwBsU"> </span><span class="n" id="mwBsY">Tree</span><span class="w" id="mwBsc"> </span><span class="o" id="mwBsg">=</span><span class="w" id="mwBsk"> </span><span class="k" id="mwBso">ref</span><span class="w" id="mwBss"> </span><span class="n" id="mwBsw">TreeObj</span> <span class="w" id="mwBs0"> </span><span class="n" id="mwBs4">TreeObj</span><span class="w" id="mwBs8"> </span><span class="o" id="mwBtA">=</span><span class="w" id="mwBtE"> </span><span class="k" id="mwBtI">object</span> <span class="w" id="mwBtM"> </span><span class="k" id="mwBtQ">case</span><span class="w" id="mwBtU"> </span><span class="n" id="mwBtY">kind</span><span class="p" id="mwBtc">:</span><span class="w" id="mwBtg"> </span><span class="n" id="mwBtk">TreeKind</span> <span class="w" id="mwBto"> </span><span class="k" id="mwBts">of</span><span class="w" id="mwBtw"> </span><span class="nl" id="mwBt0">tkEmpty</span><span class="o" id="mwBt4">:</span> <span class="w" id="mwBt8"> </span><span class="k" id="mwBuA">discard</span> <span class="w" id="mwBuE"> </span><span class="k" id="mwBuI">of</span><span class="w" id="mwBuM"> </span><span class="nl" id="mwBuQ">tkNode</span><span class="o" id="mwBuU">:</span> <span class="w" id="mwBuY"> </span><span class="n" id="mwBuc">value</span><span class="p" id="mwBug">:</span><span class="w" id="mwBuk"> </span><span class="nb" id="mwBuo">int</span> <span class="w" id="mwBus"> </span><span class="n" id="mwBuw">left</span><span class="p" id="mwBu0">,</span><span class="w" id="mwBu4"> </span><span class="n" id="mwBu8">right</span><span class="p" id="mwBvA">:</span><span class="w" id="mwBvE"> </span><span class="n" id="mwBvI">Tree</span>

And instantiated as:

<span id="mwBvY"></span><span class="k" id="mwBvc">let</span><span class="w" id="mwBvg"> </span><span class="n" id="mwBvk">myTree</span><span class="w" id="mwBvo"> </span><span class="o" id="mwBvs">=</span><span class="w" id="mwBvw"> </span><span class="n" id="mwBv0">Tree</span><span class="p" id="mwBv4">(</span><span class="n" id="mwBv8">kind</span><span class="p" id="mwBwA">:</span><span class="w" id="mwBwE"> </span><span class="n" id="mwBwI">tkNode</span><span class="p" id="mwBwM">,</span><span class="w" id="mwBwQ"> </span><span class="n" id="mwBwU">value</span><span class="p" id="mwBwY">:</span><span class="w" id="mwBwc"> </span><span class="mi" id="mwBwg">42</span><span class="p" id="mwBwk">,</span> <span class="w" id="mwBwo"> </span><span class="n" id="mwBws">left</span><span class="p" id="mwBww">:</span><span class="w" id="mwBw0"> </span><span class="n" id="mwBw4">Tree</span><span class="p" id="mwBw8">(</span><span class="n" id="mwBxA">kind</span><span class="p" id="mwBxE">:</span><span class="w" id="mwBxI"> </span><span class="n" id="mwBxM">tkNode</span><span class="p" id="mwBxQ">,</span><span class="w" id="mwBxU"> </span><span class="n" id="mwBxY">value</span><span class="p" id="mwBxc">:</span><span class="w" id="mwBxg"> </span><span class="mi" id="mwBxk">0</span><span class="p" id="mwBxo">,</span> <span class="w" id="mwBxs"> </span><span class="n" id="mwBxw">left</span><span class="p" id="mwBx0">:</span><span class="w" id="mwBx4"> </span><span class="n" id="mwBx8">Tree</span><span class="p" id="mwByA">(</span><span class="n" id="mwByE">kind</span><span class="p" id="mwByI">:</span><span class="w" id="mwByM"> </span><span class="n" id="mwByQ">tkEmpty</span><span class="p" id="mwByU">),</span> <span class="w" id="mwByY"> </span><span class="n" id="mwByc">right</span><span class="p" id="mwByg">:</span><span class="w" id="mwByk"> </span><span class="n" id="mwByo">Tree</span><span class="p" id="mwBys">(</span><span class="n" id="mwByw">kind</span><span class="p" id="mwBy0">:</span><span class="w" id="mwBy4"> </span><span class="n" id="mwBy8">tkEmpty</span><span class="p" id="mwBzA">)),</span> <span class="w" id="mwBzE"> </span><span class="n" id="mwBzI">right</span><span class="p" id="mwBzM">:</span><span class="w" id="mwBzQ"> </span><span class="n" id="mwBzU">Tree</span><span class="p" id="mwBzY">(</span><span class="n" id="mwBzc">kind</span><span class="p" id="mwBzg">:</span><span class="w" id="mwBzk"> </span><span class="n" id="mwBzo">tkEmpty</span><span class="p" id="mwBzs">))</span>

OCaml

In OCaml, an ADT may be defined with:

<span id="mwB0Y"></span><span class="k" id="mwB0c">type</span> <span class="n" id="mwB0g">tree</span> <span class="o" id="mwB0k">=</span> <span class="o" id="mwB0o">|</span> <span class="nc" id="mwB0s">Empty</span> <span class="o" id="mwB0w">|</span> <span class="nc" id="mwB00">Node</span> <span class="k" id="mwB04">of</span> <span class="kt" id="mwB08">int</span> <span class="o" id="mwB1A">*</span> <span class="n" id="mwB1E">tree</span> <span class="o" id="mwB1I">*</span> <span class="n" id="mwB1M">tree</span>

And instantiated as:

<span id="mwB1c"></span><span class="k" id="mwB1g">let</span> <span class="n" id="mwB1k">my_tree</span> <span class="o" id="mwB1o">=</span> <span class="nc" id="mwB1s">Node</span> <span class="o" id="mwB1w">(</span><span class="mi" id="mwB10">42</span><span class="o" id="mwB14">,</span> <span class="nc" id="mwB18">Node</span> <span class="o" id="mwB2A">(</span><span class="mi" id="mwB2E">0</span><span class="o" id="mwB2I">,</span> <span class="nc" id="mwB2M">Empty</span><span class="o" id="mwB2Q">,</span> <span class="nc" id="mwB2U">Empty</span><span class="o" id="mwB2Y">),</span> <span class="nc" id="mwB2c">Empty</span><span class="o" id="mwB2g">)</span>

Opa

In Opa, an ADT may be defined with:

<span id="mwB3M"></span><span class="k" id="mwB3Q">type</span> tree <span class="k" id="mwB3U">=</span> <span class="o" id="mwB3Y">{</span> empty <span class="o" id="mwB3c">}</span> <span class="k" id="mwB3g">or</span> <span class="o" id="mwB3k">{</span> node<span class="o" id="mwB3o">,</span> int value<span class="o" id="mwB3s">,</span> tree left<span class="o" id="mwB3w">,</span> tree right <span class="o" id="mwB30">}</span>

And instantiated as:

<span id="mwB4E"></span>my_tree <span class="k" id="mwB4I">=</span> <span class="o" id="mwB4M">{</span> node<span class="o" id="mwB4Q">,</span> value<span class="o" id="mwB4U">:</span> <span class="mi" id="mwB4Y">42</span><span class="o" id="mwB4c">,</span> left<span class="o" id="mwB4g">:</span> <span class="kt" id="mwB4k">{</span> <span class="kt" id="mwB4o">node,</span> <span class="kt" id="mwB4s"> value: 0,</span> <span class="kt" id="mwB4w"> left: {</span> <span class="kt" id="mwB40">empty },</span> <span class="kt" id="mwB44"> right: {</span> <span class="kt" id="mwB48">empty }</span> <span class="kt" id="mwB5A">}</span><span class="o" id="mwB5E">,</span> right<span class="o" id="mwB5I">:</span> <span class="kt" id="mwB5M">{</span> <span class="kt" id="mwB5Q">empty }</span> <span class="o" id="mwB5U">}</span>

OpenCog

In OpenCog's Atomese, an ADT is constructed inside the graph-based AtomSpace using explicit type constructors like SignatureLink and TypeChoice to represent sum and product types. A binary tree ADT may be defined with:

<span id="mwB6E"></span><span class="c1" id="mwB6I">; Define the "Tree" sum type choice</span> <span class="p" id="mwB6M">(</span><span class="nf" id="mwB6Q">TypeChoice</span> <span class="w" id="mwB6U"> </span><span class="p" id="mwB6Y">(</span><span class="nf" id="mwB6c">DefinedTypeNode</span><span class="w" id="mwB6g"> </span><span class="s" id="mwB6k">"Tree"</span><span class="p" id="mwB6o">)</span> <span class="w" id="mwB6s"> </span><span class="p" id="mwB6w">(</span><span class="nf" id="mwB60">TypeSetLink</span> <span class="w" id="mwB64"> </span><span class="p" id="mwB68">(</span><span class="nf" id="mwB7A">TypeNode</span><span class="w" id="mwB7E"> </span><span class="s" id="mwB7I">"Empty"</span><span class="p" id="mwB7M">)</span> <span class="w" id="mwB7Q"> </span><span class="p" id="mwB7U">(</span><span class="nf" id="mwB7Y">SignatureLink</span> <span class="w" id="mwB7c"> </span><span class="p" id="mwB7g">(</span><span class="nf" id="mwB7k">TypeNode</span><span class="w" id="mwB7o"> </span><span class="s" id="mwB7s">"Node"</span><span class="p" id="mwB7w">)</span> <span class="w" id="mwB70"> </span><span class="p" id="mwB74">(</span><span class="nf" id="mwB78">TypeSetLink</span><span class="w" id="mwB8A"> </span> <span class="w" id="mwB8E"> </span><span class="p" id="mwB8I">(</span><span class="nf" id="mwB8M">TypeNode</span><span class="w" id="mwB8Q"> </span><span class="s" id="mwB8U">"NumberNode"</span><span class="p" id="mwB8Y">)</span><span class="w" id="mwB8c"> </span> <span class="w" id="mwB8g"> </span><span class="p" id="mwB8k">(</span><span class="nf" id="mwB8o">DefinedTypeNode</span><span class="w" id="mwB8s"> </span><span class="s" id="mwB8w">"Tree"</span><span class="p" id="mwB80">)</span><span class="w" id="mwB84"> </span> <span class="w" id="mwB88"> </span><span class="p" id="mwB9A">(</span><span class="nf" id="mwB9E">DefinedTypeNode</span><span class="w" id="mwB9I"> </span><span class="s" id="mwB9M">"Tree"</span><span class="p" id="mwB9Q">)))))</span>

And instantiated as a graph structure:

<span id="mwB9g"></span><span class="c1" id="mwB9k">; Instantiate a tree structure equivalent to: Node(42, Node(0, Empty, Empty), Empty)</span> <span class="p" id="mwB9o">(</span><span class="nf" id="mwB9s">Node</span> <span class="w" id="mwB9w"> </span><span class="p" id="mwB90">(</span><span class="nf" id="mwB94">NumberNode</span><span class="w" id="mwB98"> </span><span class="s" id="mwB-A">"42"</span><span class="p" id="mwB-E">)</span> <span class="w" id="mwB-I"> </span><span class="p" id="mwB-M">(</span><span class="nf" id="mwB-Q">Node</span> <span class="w" id="mwB-U"> </span><span class="p" id="mwB-Y">(</span><span class="nf" id="mwB-c">NumberNode</span><span class="w" id="mwB-g"> </span><span class="s" id="mwB-k">"0"</span><span class="p" id="mwB-o">)</span> <span class="w" id="mwB-s"> </span><span class="p" id="mwB-w">(</span><span class="nf" id="mwB-0">Empty</span><span class="p" id="mwB-4">)</span> <span class="w" id="mwB-8"> </span><span class="p" id="mwB_A">(</span><span class="nf" id="mwB_E">Empty</span><span class="p" id="mwB_I">))</span> <span class="w" id="mwB_M"> </span><span class="p" id="mwB_Q">(</span><span class="nf" id="mwB_U">Empty</span><span class="p" id="mwB_Y">))</span>

PureScript

In PureScript, an ADT may be defined with:

<span id="mwCAE"></span><span class="kr" id="mwCAI">data</span><span class="w" id="mwCAM"> </span><span class="kt" id="mwCAQ">Tree</span> <span class="w" id="mwCAU"> </span><span class="ow" id="mwCAY">=</span><span class="w" id="mwCAc"> </span><span class="kt" id="mwCAg">Empty</span> <span class="w" id="mwCAk"> </span><span class="o" id="mwCAo">|</span><span class="w" id="mwCAs"> </span><span class="kt" id="mwCAw">Node</span><span class="w" id="mwCA0"> </span><span class="kt" id="mwCA4">Int</span><span class="w" id="mwCA8"> </span><span class="kt" id="mwCBA">Tree</span><span class="w" id="mwCBE"> </span><span class="kt" id="mwCBI">Tree</span>

And instantiated as:

<span id="mwCBY"></span><span class="nf" id="mwCBc">myTree</span><span class="w" id="mwCBg"> </span><span class="ow" id="mwCBk">=</span><span class="w" id="mwCBo"> </span><span class="kt" id="mwCBs">Node</span><span class="w" id="mwCBw"> </span><span class="mi" id="mwCB0">42</span><span class="w" id="mwCB4"> </span><span class="p" id="mwCB8">(</span><span class="kt" id="mwCCA">Node</span><span class="w" id="mwCCE"> </span><span class="mi" id="mwCCI">0</span><span class="w" id="mwCCM"> </span><span class="kt" id="mwCCQ">Empty</span><span class="w" id="mwCCU"> </span><span class="kt" id="mwCCY">Empty</span><span class="p" id="mwCCc">)</span><span class="w" id="mwCCg"> </span><span class="kt" id="mwCCk">Empty</span>

Python

In Python, an ADT may be defined with:

<span id="mwCDg"></span><span class="kn" id="mwCDk">from</span><span class="w" id="mwCDo"> </span><span class="nn" id="mwCDs">__future__</span><span class="w" id="mwCDw"> </span><span class="kn" id="mwCD0">import</span> <span class="n" id="mwCD4">annotations</span> <span class="kn" id="mwCD8">from</span><span class="w" id="mwCEA"> </span><span class="nn" id="mwCEE">dataclasses</span><span class="w" id="mwCEI"> </span><span class="kn" id="mwCEM">import</span> <span class="n" id="mwCEQ">dataclass</span> <span class="nd" id="mwCEU">@dataclass</span> <span class="k" id="mwCEY">class</span><span class="w" id="mwCEc"> </span><span class="nc" id="mwCEg">Empty</span><span class="p" id="mwCEk">:</span> <span class="k" id="mwCEo">pass</span> <span class="nd" id="mwCEs">@dataclass</span> <span class="k" id="mwCEw">class</span><span class="w" id="mwCE0"> </span><span class="nc" id="mwCE4">Node</span><span class="p" id="mwCE8">:</span> <span class="n" id="mwCFA">value</span><span class="p" id="mwCFE">:</span> <span class="nb" id="mwCFI">int</span> <span class="n" id="mwCFM">left</span><span class="p" id="mwCFQ">:</span> <span class="n" id="mwCFU">Tree</span> <span class="n" id="mwCFY">right</span><span class="p" id="mwCFc">:</span> <span class="n" id="mwCFg">Tree</span> <span class="n" id="mwCFk">Tree</span> <span class="o" id="mwCFo">=</span> <span class="n" id="mwCFs">Empty</span> <span class="o" id="mwCFw">|</span> <span class="n" id="mwCF0">Node</span>

And instantiated as:

<span id="mwCGE"></span><span class="n" id="mwCGI">my_tree</span> <span class="o" id="mwCGM">=</span> <span class="n" id="mwCGQ">Node</span><span class="p" id="mwCGU">(</span><span class="mi" id="mwCGY">42</span><span class="p" id="mwCGc">,</span> <span class="n" id="mwCGg">Node</span><span class="p" id="mwCGk">(</span><span class="mi" id="mwCGo">0</span><span class="p" id="mwCGs">,</span> <span class="n" id="mwCGw">Empty</span><span class="p" id="mwCG0">(),</span> <span class="n" id="mwCG4">Empty</span><span class="p" id="mwCG8">()),</span> <span class="n" id="mwCHA">Empty</span><span class="p" id="mwCHE">())</span>

Racket

In Typed Racket, an ADT may be defined with:

<span id="mwCHw"></span><span class="p" id="mwCH0">(</span><span class="k" id="mwCH4">struct</span><span class="w" id="mwCH8"> </span><span class="n" id="mwCIA">Empty</span><span class="w" id="mwCIE"> </span><span class="p" id="mwCII">())</span> <span class="p" id="mwCIM">(</span><span class="k" id="mwCIQ">struct</span><span class="w" id="mwCIU"> </span><span class="n" id="mwCIY">Node</span><span class="w" id="mwCIc"> </span><span class="p" id="mwCIg">([</span><span class="n" id="mwCIk">value</span><span class="w" id="mwCIo"> </span><span class="n" id="mwCIs">:</span><span class="w" id="mwCIw"> </span><span class="n" id="mwCI0">Integer</span><span class="p" id="mwCI4">]</span><span class="w" id="mwCI8"> </span><span class="p" id="mwCJA">[</span><span class="n" id="mwCJE">left</span><span class="w" id="mwCJI"> </span><span class="n" id="mwCJM">:</span><span class="w" id="mwCJQ"> </span><span class="n" id="mwCJU">Tree</span><span class="p" id="mwCJY">]</span><span class="w" id="mwCJc"> </span><span class="p" id="mwCJg">[</span><span class="n" id="mwCJk">right</span><span class="w" id="mwCJo"> </span><span class="n" id="mwCJs">:</span><span class="w" id="mwCJw"> </span><span class="n" id="mwCJ0">Tree</span><span class="p" id="mwCJ4">]))</span> <span class="p" id="mwCJ8">(</span><span class="n" id="mwCKA">define-type</span><span class="w" id="mwCKE"> </span><span class="n" id="mwCKI">Tree</span><span class="w" id="mwCKM"> </span><span class="p" id="mwCKQ">(</span><span class="n" id="mwCKU">U</span><span class="w" id="mwCKY"> </span><span class="n" id="mwCKc">Empty</span><span class="w" id="mwCKg"> </span><span class="n" id="mwCKk">Node</span><span class="p" id="mwCKo">))</span>

And instantiated as:

<span id="mwCK4"></span><span class="p" id="mwCK8">(</span><span class="k" id="mwCLA">define</span><span class="w" id="mwCLE"> </span><span class="n" id="mwCLI">my-tree</span><span class="w" id="mwCLM"> </span><span class="p" id="mwCLQ">(</span><span class="n" id="mwCLU">Node</span><span class="w" id="mwCLY"> </span><span class="mi" id="mwCLc">42</span><span class="w" id="mwCLg"> </span><span class="p" id="mwCLk">(</span><span class="n" id="mwCLo">Node</span><span class="w" id="mwCLs"> </span><span class="mi" id="mwCLw">0</span><span class="w" id="mwCL0"> </span><span class="p" id="mwCL4">(</span><span class="n" id="mwCL8">Empty</span><span class="p" id="mwCMA">)</span><span class="w" id="mwCME"> </span><span class="p" id="mwCMI">(</span><span class="n" id="mwCMM">Empty</span><span class="p" id="mwCMQ">))</span><span class="w" id="mwCMU"> </span><span class="p" id="mwCMY">(</span><span class="n" id="mwCMc">Empty</span><span class="p" id="mwCMg">)))</span>

Reason

In Reason, an ADT may be defined with:

<span id="mwCNM"></span><span class="k" id="mwCNQ">type</span> <span class="nc" id="mwCNU">Tree</span> <span class="ow" id="mwCNY">=</span> <span class="ow" id="mwCNc">|</span> <span class="nc" id="mwCNg">Empty</span> <span class="ow" id="mwCNk">|</span> <span class="nc" id="mwCNo">Node</span><span class="ow" id="mwCNs">(</span><span class="kt" id="mwCNw">int</span><span class="ow" id="mwCN0">,</span> <span class="nc" id="mwCN4">Tree</span><span class="ow" id="mwCN8">,</span> <span class="nc" id="mwCOA">Tree</span><span class="ow" id="mwCOE">);</span>

And instantiated as:

<span id="mwCOU"></span><span class="k" id="mwCOY">let</span> <span class="n" id="mwCOc">myTree</span> <span class="ow" id="mwCOg">=</span> <span class="nc" id="mwCOk">Node</span><span class="ow" id="mwCOo">(</span><span class="mi" id="mwCOs">42</span><span class="ow" id="mwCOw">,</span> <span class="nc" id="mwCO0">Node</span><span class="ow" id="mwCO4">(</span><span class="mi" id="mwCO8">0</span><span class="ow" id="mwCPA">,</span> <span class="nc" id="mwCPE">Empty</span><span class="ow" id="mwCPI">,</span> <span class="nc" id="mwCPM">Empty</span><span class="ow" id="mwCPQ">),</span> <span class="nc" id="mwCPU">Empty</span><span class="ow" id="mwCPY">);</span>

ReScript

In ReScript, an ADT may be defined with:

<span id="mwCQE"></span><span class="kr" id="mwCQI">type</span><span class="w" id="mwCQM"> </span><span class="n" id="mwCQQ">rec</span><span class="w" id="mwCQU"> </span><span class="kt" id="mwCQY">Tree</span><span class="w" id="mwCQc"> </span><span class="ow" id="mwCQg">=</span> <span class="w" id="mwCQk"> </span><span class="o" id="mwCQo">|</span><span class="w" id="mwCQs"> </span><span class="kt" id="mwCQw">Empty</span> <span class="w" id="mwCQ0"> </span><span class="o" id="mwCQ4">|</span><span class="w" id="mwCQ8"> </span><span class="kt" id="mwCRA">Node</span><span class="p" id="mwCRE">(</span><span class="n" id="mwCRI">int</span><span class="p" id="mwCRM">,</span><span class="w" id="mwCRQ"> </span><span class="kt" id="mwCRU">Tree</span><span class="p" id="mwCRY">,</span><span class="w" id="mwCRc"> </span><span class="kt" id="mwCRg">Tree</span><span class="p" id="mwCRk">)</span>

And instantiated as:

<span id="mwCR0"></span><span class="kr" id="mwCR4">let</span><span class="w" id="mwCR8"> </span><span class="n" id="mwCSA">myTree</span><span class="w" id="mwCSE"> </span><span class="ow" id="mwCSI">=</span><span class="w" id="mwCSM"> </span><span class="kt" id="mwCSQ">Node</span><span class="p" id="mwCSU">(</span><span class="mi" id="mwCSY">42</span><span class="p" id="mwCSc">,</span><span class="w" id="mwCSg"> </span><span class="kt" id="mwCSk">Node</span><span class="p" id="mwCSo">(</span><span class="mi" id="mwCSs">0</span><span class="p" id="mwCSw">,</span><span class="w" id="mwCS0"> </span><span class="kt" id="mwCS4">Empty</span><span class="p" id="mwCS8">,</span><span class="w" id="mwCTA"> </span><span class="kt" id="mwCTE">Empty</span><span class="p" id="mwCTI">),</span><span class="w" id="mwCTM"> </span><span class="kt" id="mwCTQ">Empty</span><span class="p" id="mwCTU">)</span>

Rocq

In Rocq, an ADT may be defined with:

<span id="mwCUE"></span><span class="kn" id="mwCUI">Inductive</span> <span class="n" id="mwCUM">tree</span> <span class="o" id="mwCUQ">:</span> <span class="kt" id="mwCUU">Type</span> <span class="o" id="mwCUY">:=</span> <span class="o" id="mwCUc">|</span> <span class="n" id="mwCUg">empty</span> <span class="o" id="mwCUk">:</span> <span class="n" id="mwCUo">tree</span> <span class="o" id="mwCUs">|</span> <span class="n" id="mwCUw">node</span> <span class="o" id="mwCU0">:</span> <span class="n" id="mwCU4">nat</span> <span class="o" id="mwCU8">-></span> <span class="n" id="mwCVA">tree</span> <span class="o" id="mwCVE">-></span> <span class="n" id="mwCVI">tree</span> <span class="o" id="mwCVM">-></span> <span class="n" id="mwCVQ">tree</span><span class="o" id="mwCVU">.</span>

And instantiated as:

<span id="mwCVk"></span><span class="kn" id="mwCVo">Definition</span> <span class="n" id="mwCVs">my_tree</span> <span class="o" id="mwCVw">:=</span> <span class="n" id="mwCV0">node</span> <span class="mi" id="mwCV4">42</span> <span class="o" id="mwCV8">(</span><span class="n" id="mwCWA">node</span> <span class="mi" id="mwCWE">0</span> <span class="n" id="mwCWI">empty</span> <span class="n" id="mwCWM">empty</span><span class="o" id="mwCWQ">)</span> <span class="n" id="mwCWU">empty</span><span class="o" id="mwCWY">.</span>

Rust

In Rust, an ADT may be defined with:

<span id="mwCXE"></span><span class="k" id="mwCXI">enum</span><span class="w" id="mwCXM"> </span><span class="nc" id="mwCXQ">Tree</span><span class="w" id="mwCXU"> </span><span class="p" id="mwCXY">{</span> <span class="w" id="mwCXc"> </span><span class="n" id="mwCXg">Empty</span><span class="p" id="mwCXk">,</span> <span class="w" id="mwCXo"> </span><span class="n" id="mwCXs">Node</span><span class="p" id="mwCXw">(</span><span class="kt" id="mwCX0">i32</span><span class="p" id="mwCX4">,</span><span class="w" id="mwCX8"> </span><span class="nb" id="mwCYA">Box</span><span class="o" id="mwCYE"><</span><span class="n" id="mwCYI">Tree</span><span class="o" id="mwCYM">></span><span class="p" id="mwCYQ">,</span><span class="w" id="mwCYU"> </span><span class="nb" id="mwCYY">Box</span><span class="o" id="mwCYc"><</span><span class="n" id="mwCYg">Tree</span><span class="o" id="mwCYk">></span><span class="p" id="mwCYo">),</span> <span class="p" id="mwCYs">}</span>

And instantiated as:

<span id="mwCY8"></span><span class="kd" id="mwCZA">let</span><span class="w" id="mwCZE"> </span><span class="n" id="mwCZI">my_tree</span><span class="w" id="mwCZM"> </span><span class="o" id="mwCZQ">=</span><span class="w" id="mwCZU"> </span><span class="n" id="mwCZY">Tree</span><span class="p" id="mwCZc">::</span><span class="n" id="mwCZg">Node</span><span class="p" id="mwCZk">(</span> <span class="w" id="mwCZo"> </span><span class="mi" id="mwCZs">42</span><span class="p" id="mwCZw">,</span> <span class="w" id="mwCZ0"> </span><span class="nb" id="mwCZ4">Box</span><span class="p" id="mwCZ8">::</span><span class="n" id="mwCaA">new</span><span class="p" id="mwCaE">(</span><span class="n" id="mwCaI">Tree</span><span class="p" id="mwCaM">::</span><span class="n" id="mwCaQ">Node</span><span class="p" id="mwCaU">(</span><span class="mi" id="mwCaY">0</span><span class="p" id="mwCac">,</span><span class="w" id="mwCag"> </span><span class="nb" id="mwCak">Box</span><span class="p" id="mwCao">::</span><span class="n" id="mwCas">new</span><span class="p" id="mwCaw">(</span><span class="n" id="mwCa0">Tree</span><span class="p" id="mwCa4">::</span><span class="n" id="mwCa8">Empty</span><span class="p" id="mwCbA">),</span><span class="w" id="mwCbE"> </span><span class="nb" id="mwCbI">Box</span><span class="p" id="mwCbM">::</span><span class="n" id="mwCbQ">new</span><span class="p" id="mwCbU">(</span><span class="n" id="mwCbY">Tree</span><span class="p" id="mwCbc">::</span><span class="n" id="mwCbg">Empty</span><span class="p" id="mwCbk">)),</span> <span class="w" id="mwCbo"> </span><span class="nb" id="mwCbs">Box</span><span class="p" id="mwCbw">::</span><span class="n" id="mwCb0">new</span><span class="p" id="mwCb4">(</span><span class="n" id="mwCb8">Tree</span><span class="p" id="mwCcA">::</span><span class="n" id="mwCcE">Empty</span><span class="p" id="mwCcI">),</span> <span class="p" id="mwCcM">);</span>

Scala

Scala 2

In Scala 2, an ADT may be defined with:

<span id="mwCc0"></span><span class="k" id="mwCc4">sealed</span><span class="w" id="mwCc8"> </span><span class="k" id="mwCdA">abstract</span><span class="w" id="mwCdE"> </span><span class="k" id="mwCdI">class</span><span class="w" id="mwCdM"> </span><span class="nc" id="mwCdQ">Tree</span><span class="w" id="mwCdU"> </span><span class="k" id="mwCdY">extends</span><span class="w" id="mwCdc"> </span><span class="nc" id="mwCdg">Product</span><span class="w" id="mwCdk"> </span><span class="k" id="mwCdo">with</span><span class="w" id="mwCds"> </span><span class="nc" id="mwCdw">Serializable</span> <span class="k" id="mwCd0">object</span><span class="w" id="mwCd4"> </span><span class="nc" id="mwCd8">Tree</span><span class="w" id="mwCeA"> </span><span class="p" id="mwCeE">{</span> <span class="w" id="mwCeI"> </span><span class="k" id="mwCeM">final</span><span class="w" id="mwCeQ"> </span><span class="k" id="mwCeU">case</span><span class="w" id="mwCeY"> </span><span class="k" id="mwCec">object</span><span class="w" id="mwCeg"> </span><span class="nc" id="mwCek">Empty</span><span class="w" id="mwCeo"> </span><span class="k" id="mwCes">extends</span><span class="w" id="mwCew"> </span><span class="nc" id="mwCe0">Tree</span> <span class="w" id="mwCe4"> </span><span class="k" id="mwCe8">final</span><span class="w" id="mwCfA"> </span><span class="k" id="mwCfE">case</span><span class="w" id="mwCfI"> </span><span class="k" id="mwCfM">class</span><span class="w" id="mwCfQ"> </span><span class="nc" id="mwCfU">Node</span><span class="p" id="mwCfY">(</span><span class="n" id="mwCfc">value</span><span class="p" id="mwCfg">:</span><span class="w" id="mwCfk"> </span><span class="nc" id="mwCfo">Int</span><span class="p" id="mwCfs">,</span><span class="w" id="mwCfw"> </span><span class="n" id="mwCf0">left</span><span class="p" id="mwCf4">:</span><span class="w" id="mwCf8"> </span><span class="nc" id="mwCgA">Tree</span><span class="p" id="mwCgE">,</span><span class="w" id="mwCgI"> </span><span class="n" id="mwCgM">right</span><span class="p" id="mwCgQ">:</span><span class="w" id="mwCgU"> </span><span class="nc" id="mwCgY">Tree</span><span class="p" id="mwCgc">)</span> <span class="w" id="mwCgg"> </span><span class="k" id="mwCgk">extends</span><span class="w" id="mwCgo"> </span><span class="nc" id="mwCgs">Tree</span> <span class="p" id="mwCgw">}</span>

And instantiated as:

<span id="mwChA"></span><span class="kd" id="mwChE">val</span><span class="w" id="mwChI"> </span><span class="n" id="mwChM">myTree</span><span class="w" id="mwChQ"> </span><span class="o" id="mwChU">=</span><span class="w" id="mwChY"> </span><span class="nc" id="mwChc">Tree</span><span class="p" id="mwChg">.</span><span class="nc" id="mwChk">Node</span><span class="p" id="mwCho">(</span> <span class="w" id="mwChs"> </span><span class="mi" id="mwChw">42</span><span class="p" id="mwCh0">,</span> <span class="w" id="mwCh4"> </span><span class="nc" id="mwCh8">Tree</span><span class="p" id="mwCiA">.</span><span class="nc" id="mwCiE">Node</span><span class="p" id="mwCiI">(</span><span class="mi" id="mwCiM">0</span><span class="p" id="mwCiQ">,</span><span class="w" id="mwCiU"> </span><span class="nc" id="mwCiY">Tree</span><span class="p" id="mwCic">.</span><span class="nc" id="mwCig">Empty</span><span class="p" id="mwCik">,</span><span class="w" id="mwCio"> </span><span class="nc" id="mwCis">Tree</span><span class="p" id="mwCiw">.</span><span class="nc" id="mwCi0">Empty</span><span class="p" id="mwCi4">),</span> <span class="w" id="mwCi8"> </span><span class="nc" id="mwCjA">Tree</span><span class="p" id="mwCjE">.</span><span class="nc" id="mwCjI">Empty</span> <span class="p" id="mwCjM">)</span>

Scala 3

In Scala 3, an ADT may be defined with:

<span id="mwCjw"></span><span class="k" id="mwCj0">enum</span><span class="w" id="mwCj4"> </span><span class="nc" id="mwCj8">Tree</span><span class="p" id="mwCkA">:</span> <span class="w" id="mwCkE"> </span><span class="k" id="mwCkI">case</span><span class="w" id="mwCkM"> </span><span class="nc" id="mwCkQ">Empty</span> <span class="w" id="mwCkU"> </span><span class="k" id="mwCkY">case</span><span class="w" id="mwCkc"> </span><span class="nc" id="mwCkg">Node</span><span class="p" id="mwCkk">(</span><span class="n" id="mwCko">value</span><span class="p" id="mwCks">:</span><span class="w" id="mwCkw"> </span><span class="nc" id="mwCk0">Int</span><span class="p" id="mwCk4">,</span><span class="w" id="mwCk8"> </span><span class="n" id="mwClA">left</span><span class="p" id="mwClE">:</span><span class="w" id="mwClI"> </span><span class="nc" id="mwClM">Tree</span><span class="p" id="mwClQ">,</span><span class="w" id="mwClU"> </span><span class="n" id="mwClY">right</span><span class="p" id="mwClc">:</span><span class="w" id="mwClg"> </span><span class="nc" id="mwClk">Tree</span><span class="p" id="mwClo">)</span>

And instantiated as:

<span id="mwCl4"></span><span class="kd" id="mwCl8">val</span><span class="w" id="mwCmA"> </span><span class="n" id="mwCmE">myTree</span><span class="w" id="mwCmI"> </span><span class="o" id="mwCmM">=</span><span class="w" id="mwCmQ"> </span><span class="nc" id="mwCmU">Tree</span><span class="p" id="mwCmY">.</span><span class="nc" id="mwCmc">Node</span><span class="p" id="mwCmg">(</span> <span class="w" id="mwCmk"> </span><span class="mi" id="mwCmo">42</span><span class="p" id="mwCms">,</span> <span class="w" id="mwCmw"> </span><span class="nc" id="mwCm0">Tree</span><span class="p" id="mwCm4">.</span><span class="nc" id="mwCm8">Node</span><span class="p" id="mwCnA">(</span><span class="mi" id="mwCnE">0</span><span class="p" id="mwCnI">,</span><span class="w" id="mwCnM"> </span><span class="nc" id="mwCnQ">Tree</span><span class="p" id="mwCnU">.</span><span class="nc" id="mwCnY">Empty</span><span class="p" id="mwCnc">,</span><span class="w" id="mwCng"> </span><span class="nc" id="mwCnk">Tree</span><span class="p" id="mwCno">.</span><span class="nc" id="mwCns">Empty</span><span class="p" id="mwCnw">),</span> <span class="w" id="mwCn0"> </span><span class="nc" id="mwCn4">Tree</span><span class="p" id="mwCn8">.</span><span class="nc" id="mwCoA">Empty</span> <span class="p" id="mwCoE">)</span>

Standard ML

In Standard ML, an ADT may be defined with:

<span id="mwCow"></span><span class="kr" id="mwCo0">datatype</span> <span class="kt" id="mwCo4">tree</span> <span class="p" id="mwCo8">=</span> <span class="nc" id="mwCpA">EMPTY</span> <span class="p" id="mwCpE">|</span> <span class="nc" id="mwCpI">NODE</span> <span class="kr" id="mwCpM">of</span> <span class="n" id="mwCpQ">int</span> <span class="n" id="mwCpU">*</span> <span class="n" id="mwCpY">tree</span> <span class="n" id="mwCpc">*</span> <span class="n" id="mwCpg">tree</span>

And instantiated as:

<span id="mwCpw"></span><span class="kr" id="mwCp0">val</span> <span class="nv" id="mwCp4">myTree</span> <span class="p" id="mwCp8">=</span> <span class="n" id="mwCqA">NODE</span> <span class="p" id="mwCqE">(</span><span class="mi" id="mwCqI">42</span><span class="p" id="mwCqM">,</span> <span class="n" id="mwCqQ">NODE</span> <span class="p" id="mwCqU">(</span><span class="mi" id="mwCqY">0</span><span class="p" id="mwCqc">,</span> <span class="n" id="mwCqg">EMPTY</span><span class="p" id="mwCqk">,</span> <span class="n" id="mwCqo">EMPTY</span><span class="p" id="mwCqs">),</span> <span class="n" id="mwCqw">EMPTY</span><span class="p" id="mwCq0">)</span>

Swift

In Swift, an ADT may be defined with:

<span id="mwCrg"></span><span class="kd" id="mwCrk">enum</span><span class="w" id="mwCro"> </span><span class="nc" id="mwCrs">Tree</span><span class="w" id="mwCrw"> </span><span class="p" id="mwCr0">{</span> <span class="w" id="mwCr4"> </span><span class="k" id="mwCr8">case</span><span class="w" id="mwCsA"> </span><span class="n" id="mwCsE">empty</span> <span class="w" id="mwCsI"> </span><span class="kr" id="mwCsM">indirect</span><span class="w" id="mwCsQ"> </span><span class="k" id="mwCsU">case</span><span class="w" id="mwCsY"> </span><span class="n" id="mwCsc">node</span><span class="p" id="mwCsg">(</span><span class="nb" id="mwCsk">Int</span><span class="p" id="mwCso">,</span><span class="w" id="mwCss"> </span><span class="n" id="mwCsw">Tree</span><span class="p" id="mwCs0">,</span><span class="w" id="mwCs4"> </span><span class="n" id="mwCs8">Tree</span><span class="p" id="mwCtA">)</span> <span class="p" id="mwCtE">}</span>

And instantiated as:

<span id="mwCtU"></span><span class="kd" id="mwCtY">let</span><span class="w" id="mwCtc"> </span><span class="nv" id="mwCtg">myTree</span><span class="p" id="mwCtk">:</span><span class="w" id="mwCto"> </span><span class="n" id="mwCts">Tree</span><span class="w" id="mwCtw"> </span><span class="p" id="mwCt0">=</span><span class="w" id="mwCt4"> </span><span class="p" id="mwCt8">.</span><span class="n" id="mwCuA">node</span><span class="p" id="mwCuE">(</span><span class="mi" id="mwCuI">42</span><span class="p" id="mwCuM">,</span><span class="w" id="mwCuQ"> </span><span class="p" id="mwCuU">.</span><span class="n" id="mwCuY">node</span><span class="p" id="mwCuc">(</span><span class="mi" id="mwCug">0</span><span class="p" id="mwCuk">,</span><span class="w" id="mwCuo"> </span><span class="p" id="mwCus">.</span><span class="n" id="mwCuw">empty</span><span class="p" id="mwCu0">,</span><span class="w" id="mwCu4"> </span><span class="p" id="mwCu8">.</span><span class="n" id="mwCvA">empty</span><span class="p" id="mwCvE">),</span><span class="w" id="mwCvI"> </span><span class="p" id="mwCvM">.</span><span class="n" id="mwCvQ">empty</span><span class="p" id="mwCvU">)</span>

TypeScript

In TypeScript, an ADT may be defined with:

<span id="mwCwA"></span><span class="kr" id="mwCwE">type</span><span class="w" id="mwCwI"> </span><span class="nx" id="mwCwM">Tree</span><span class="w" id="mwCwQ"> </span><span class="o" id="mwCwU">=</span> <span class="w" id="mwCwY"> </span><span class="o" id="mwCwc">|</span><span class="w" id="mwCwg"> </span><span class="p" id="mwCwk">{</span><span class="w" id="mwCwo"> </span><span class="nx" id="mwCws">kind</span><span class="o" id="mwCww">:</span><span class="w" id="mwCw0"> </span><span class="s2" id="mwCw4">"empty"</span><span class="w" id="mwCw8"> </span><span class="p" id="mwCxA">}</span> <span class="w" id="mwCxE"> </span><span class="o" id="mwCxI">|</span><span class="w" id="mwCxM"> </span><span class="p" id="mwCxQ">{</span><span class="w" id="mwCxU"> </span><span class="nx" id="mwCxY">kind</span><span class="o" id="mwCxc">:</span><span class="w" id="mwCxg"> </span><span class="s2" id="mwCxk">"node"</span><span class="p" id="mwCxo">;</span><span class="w" id="mwCxs"> </span><span class="nx" id="mwCxw">value</span><span class="o" id="mwCx0">:</span><span class="w" id="mwCx4"> </span><span class="kt" id="mwCx8">number</span><span class="p" id="mwCyA">;</span><span class="w" id="mwCyE"> </span><span class="nx" id="mwCyI">left</span><span class="o" id="mwCyM">:</span><span class="w" id="mwCyQ"> </span><span class="kt" id="mwCyU">Tree</span><span class="p" id="mwCyY">;</span><span class="w" id="mwCyc"> </span><span class="nx" id="mwCyg">right</span><span class="o" id="mwCyk">:</span><span class="w" id="mwCyo"> </span><span class="kt" id="mwCys">Tree</span><span class="w" id="mwCyw"> </span><span class="p" id="mwCy0">};</span>

And instantiated as:

<span id="mwCzE"></span><span class="kd" id="mwCzI">const</span><span class="w" id="mwCzM"> </span><span class="nx" id="mwCzQ">myTree</span><span class="o" id="mwCzU">:</span><span class="w" id="mwCzY"> </span><span class="kt" id="mwCzc">Tree</span><span class="w" id="mwCzg"> </span><span class="o" id="mwCzk">=</span><span class="w" id="mwCzo"> </span><span class="p" id="mwCzs">{</span> <span class="w" id="mwCzw"> </span><span class="nx" id="mwCz0">kind</span><span class="o" id="mwCz4">:</span><span class="w" id="mwCz8"> </span><span class="s2" id="mwC0A">"node"</span><span class="p" id="mwC0E">,</span> <span class="w" id="mwC0I"> </span><span class="nx" id="mwC0M">value</span><span class="o" id="mwC0Q">:</span><span class="w" id="mwC0U"> </span><span class="kt" id="mwC0Y">42</span><span class="p" id="mwC0c">,</span> <span class="w" id="mwC0g"> </span><span class="nx" id="mwC0k">left</span><span class="o" id="mwC0o">:</span><span class="w" id="mwC0s"> </span><span class="p" id="mwC0w">{</span> <span class="w" id="mwC00"> </span><span class="nx" id="mwC04">kind</span><span class="o" id="mwC08">:</span><span class="w" id="mwC1A"> </span><span class="s2" id="mwC1E">"node"</span><span class="p" id="mwC1I">,</span> <span class="w" id="mwC1M"> </span><span class="nx" id="mwC1Q">value</span><span class="o" id="mwC1U">:</span><span class="w" id="mwC1Y"> </span><span class="kt" id="mwC1c">0</span><span class="p" id="mwC1g">,</span> <span class="w" id="mwC1k"> </span><span class="nx" id="mwC1o">left</span><span class="o" id="mwC1s">:</span><span class="w" id="mwC1w"> </span><span class="p" id="mwC10">{</span><span class="w" id="mwC14"> </span><span class="nx" id="mwC18">kind</span><span class="o" id="mwC2A">:</span><span class="w" id="mwC2E"> </span><span class="s2" id="mwC2I">"empty"</span><span class="w" id="mwC2M"> </span><span class="p" id="mwC2Q">},</span> <span class="w" id="mwC2U"> </span><span class="nx" id="mwC2Y">right</span><span class="o" id="mwC2c">:</span><span class="w" id="mwC2g"> </span><span class="p" id="mwC2k">{</span><span class="w" id="mwC2o"> </span><span class="nx" id="mwC2s">kind</span><span class="o" id="mwC2w">:</span><span class="w" id="mwC20"> </span><span class="s2" id="mwC24">"empty"</span><span class="w" id="mwC28"> </span><span class="p" id="mwC3A">},</span> <span class="w" id="mwC3E"> </span><span class="p" id="mwC3I">},</span> <span class="w" id="mwC3M"> </span><span class="nx" id="mwC3Q">right</span><span class="o" id="mwC3U">:</span><span class="w" id="mwC3Y"> </span><span class="p" id="mwC3c">{</span><span class="w" id="mwC3g"> </span><span class="nx" id="mwC3k">kind</span><span class="o" id="mwC3o">:</span><span class="w" id="mwC3s"> </span><span class="s2" id="mwC3w">"empty"</span><span class="w" id="mwC30"> </span><span class="p" id="mwC34">},</span> <span class="p" id="mwC38">};</span>

Visual Prolog

In Visual Prolog, an ADT may be defined with:

<span id="mwC4o"></span><span class="k" id="mwC4s">domains</span> <span class="w" id="mwC4w"> </span><span class="n" id="mwC40">tree</span><span class="w" id="mwC44"> </span><span class="o" id="mwC48">=</span><span class="w" id="mwC5A"> </span><span class="n" id="mwC5E">empty</span>;<span class="w" id="mwC5I"> </span><span class="n" id="mwC5M">node</span><span class="p" id="mwC5Q">(</span><span class="n" id="mwC5U">integer</span><span class="p" id="mwC5Y">,</span><span class="w" id="mwC5c"> </span><span class="n" id="mwC5g">tree</span><span class="p" id="mwC5k">,</span><span class="w" id="mwC5o"> </span><span class="n" id="mwC5s">tree</span><span class="p" id="mwC5w">).</span>

And instantiated as:

<span id="mwC6A"></span><span class="k" id="mwC6E">constants</span> <span class="w" id="mwC6I"> </span><span class="n" id="mwC6M">my_tree</span><span class="w" id="mwC6Q"> </span><span class="o" id="mwC6U">:</span><span class="w" id="mwC6Y"> </span><span class="n" id="mwC6c">tree</span><span class="w" id="mwC6g"> </span><span class="o" id="mwC6k">=</span><span class="w" id="mwC6o"> </span><span class="n" id="mwC6s">node</span><span class="p" id="mwC6w">(</span><span class="m" id="mwC60">42</span><span class="p" id="mwC64">,</span><span class="w" id="mwC68"> </span><span class="n" id="mwC7A">node</span><span class="p" id="mwC7E">(</span><span class="m" id="mwC7I">0</span><span class="p" id="mwC7M">,</span><span class="w" id="mwC7Q"> </span><span class="n" id="mwC7U">empty</span><span class="p" id="mwC7Y">,</span><span class="w" id="mwC7c"> </span><span class="n" id="mwC7g">empty</span><span class="p" id="mwC7k">),</span><span class="w" id="mwC7o"> </span><span class="n" id="mwC7s">empty</span><span class="p" id="mwC7w">).</span>

Zig

In Zig, an ADT may be defined with:

<span id="mwC8c"></span><span class="kr" id="mwC8g">const</span><span class="w" id="mwC8k"> </span><span class="n" id="mwC8o">Tree</span><span class="w" id="mwC8s"> </span><span class="o" id="mwC8w">=</span><span class="w" id="mwC80"> </span><span class="k" id="mwC84">union</span><span class="p" id="mwC88">(</span><span class="k" id="mwC9A">enum</span><span class="p" id="mwC9E">)</span><span class="w" id="mwC9I"> </span><span class="p" id="mwC9M">{</span> <span class="w" id="mwC9Q"> </span><span class="n" id="mwC9U">empty</span><span class="p" id="mwC9Y">,</span> <span class="w" id="mwC9c"> </span><span class="n" id="mwC9g">node</span><span class="o" id="mwC9k">:</span><span class="w" id="mwC9o"> </span><span class="k" id="mwC9s">struct</span><span class="w" id="mwC9w"> </span><span class="p" id="mwC90">{</span> <span class="w" id="mwC94"> </span><span class="n" id="mwC98">value</span><span class="o" id="mwC-A">:</span><span class="w" id="mwC-E"> </span><span class="kt" id="mwC-I">i32</span><span class="p" id="mwC-M">,</span> <span class="w" id="mwC-Q"> </span><span class="n" id="mwC-U">left</span><span class="o" id="mwC-Y">:</span><span class="w" id="mwC-c"> </span><span class="o" id="mwC-g">*</span><span class="kr" id="mwC-k">const</span><span class="w" id="mwC-o"> </span><span class="n" id="mwC-s">Tree</span><span class="p" id="mwC-w">,</span> <span class="w" id="mwC-0"> </span><span class="n" id="mwC-4">right</span><span class="o" id="mwC-8">:</span><span class="w" id="mwC_A"> </span><span class="o" id="mwC_E">*</span><span class="kr" id="mwC_I">const</span><span class="w" id="mwC_M"> </span><span class="n" id="mwC_Q">Tree</span><span class="p" id="mwC_U">,</span> <span class="w" id="mwC_Y"> </span><span class="p" id="mwC_c">},</span> <span class="p" id="mwC_g">};</span>

And instantiated as:

<span id="mwC_w"></span><span class="kr" id="mwC_0">const</span><span class="w" id="mwC_4"> </span><span class="n" id="mwC_8">my_tree</span><span class="o" id="mwDAA">:</span><span class="w" id="mwDAE"> </span><span class="n" id="mwDAI">Tree</span><span class="w" id="mwDAM"> </span><span class="o" id="mwDAQ">=</span><span class="w" id="mwDAU"> </span><span class="p" id="mwDAY">.{</span><span class="w" id="mwDAc"> </span><span class="p" id="mwDAg">.</span><span class="n" id="mwDAk">node</span><span class="w" id="mwDAo"> </span><span class="o" id="mwDAs">=</span><span class="w" id="mwDAw"> </span><span class="p" id="mwDA0">.{</span> <span class="w" id="mwDA4"> </span><span class="p" id="mwDA8">.</span><span class="n" id="mwDBA">value</span><span class="w" id="mwDBE"> </span><span class="o" id="mwDBI">=</span><span class="w" id="mwDBM"> </span><span class="mi" id="mwDBQ">42</span><span class="p" id="mwDBU">,</span> <span class="w" id="mwDBY"> </span><span class="p" id="mwDBc">.</span><span class="n" id="mwDBg">left</span><span class="w" id="mwDBk"> </span><span class="o" id="mwDBo">=</span><span class="w" id="mwDBs"> </span><span class="o" id="mwDBw">&</span><span class="p" id="mwDB0">.{</span><span class="w" id="mwDB4"> </span><span class="p" id="mwDB8">.</span><span class="n" id="mwDCA">node</span><span class="w" id="mwDCE"> </span><span class="o" id="mwDCI">=</span><span class="w" id="mwDCM"> </span><span class="p" id="mwDCQ">.{</span> <span class="w" id="mwDCU"> </span><span class="p" id="mwDCY">.</span><span class="n" id="mwDCc">value</span><span class="w" id="mwDCg"> </span><span class="o" id="mwDCk">=</span><span class="w" id="mwDCo"> </span><span class="mi" id="mwDCs">0</span><span class="p" id="mwDCw">,</span> <span class="w" id="mwDC0"> </span><span class="p" id="mwDC4">.</span><span class="n" id="mwDC8">left</span><span class="w" id="mwDDA"> </span><span class="o" id="mwDDE">=</span><span class="w" id="mwDDI"> </span><span class="o" id="mwDDM">&</span><span class="p" id="mwDDQ">.</span><span class="n" id="mwDDU">empty</span><span class="p" id="mwDDY">,</span> <span class="w" id="mwDDc"> </span><span class="p" id="mwDDg">.</span><span class="n" id="mwDDk">right</span><span class="w" id="mwDDo"> </span><span class="o" id="mwDDs">=</span><span class="w" id="mwDDw"> </span><span class="o" id="mwDD0">&</span><span class="p" id="mwDD4">.</span><span class="n" id="mwDD8">empty</span><span class="p" id="mwDEA">,</span> <span class="w" id="mwDEE"> </span><span class="p" id="mwDEI">}</span><span class="w" id="mwDEM"> </span><span class="p" id="mwDEQ">},</span> <span class="w" id="mwDEU"> </span><span class="p" id="mwDEY">.</span><span class="n" id="mwDEc">right</span><span class="w" id="mwDEg"> </span><span class="o" id="mwDEk">=</span><span class="w" id="mwDEo"> </span><span class="o" id="mwDEs">&</span><span class="p" id="mwDEw">.</span><span class="n" id="mwDE0">empty</span><span class="p" id="mwDE4">,</span> <span class="p" id="mwDE8">}</span><span class="w" id="mwDFA"> </span><span class="p" id="mwDFE">};</span>

More in Computing and communication