<span class="hljs-comment">/* type variables */</span>
<span class="hljs-keyword">type</span> t(<span class="hljs-symbol">&#x27;a</span>) = <span class="hljs-built_in">list</span>(<span class="hljs-symbol">&#x27;a</span>);
<span class="hljs-keyword">let</span> f = (a: <span class="hljs-built_in">list</span>(<span class="hljs-symbol">&#x27;a</span>)): <span class="hljs-symbol">&#x27;a</span> =&gt; <span class="hljs-type">List</span>.hd(a);

<span class="hljs-comment">/* polymorphic variants */</span>
<span class="hljs-keyword">type</span> t = [ | <span class="hljs-type">`A</span> | <span class="hljs-type">`B</span>];

<span class="hljs-comment">/* variants */</span>
<span class="hljs-keyword">type</span> result =
  | <span class="hljs-type">Sat</span>
  | <span class="hljs-type">Unsat</span>
  | <span class="hljs-type">Unknown</span>;

<span class="hljs-comment">/* module and module types */</span>
<span class="hljs-keyword">module</span> <span class="hljs-keyword">type</span> <span class="hljs-type">S</span> = {<span class="hljs-keyword">let</span> compute: <span class="hljs-built_in">unit</span> =&gt; <span class="hljs-built_in">unit</span>;};
<span class="hljs-keyword">module</span> <span class="hljs-type">Impl</span>: <span class="hljs-type">S</span> = {
  <span class="hljs-keyword">let</span> compute = <span class="hljs-literal">()</span> =&gt; <span class="hljs-literal">()</span>;
};

<span class="hljs-comment">/* types with attributes */</span>
[@bs.deriving jsConverter]
<span class="hljs-keyword">type</span> action = [ | <span class="hljs-type">`Click</span> | [@bs.<span class="hljs-keyword">as</span> <span class="hljs-string">&quot;submit&quot;</span>] <span class="hljs-type">`Submit</span> | <span class="hljs-type">`Cancel</span>];
