Comparison of programming languages (algebraic data type)
- 32 min read
- 1 chapter
Explore on Lably
ToursExplore Lably’s 3D toursExamples 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>
