<span class="hljs-comment">// Testing type definition and type annotation highlighting:</span>

<span class="hljs-keyword">let</span> test&#x27;test <span class="hljs-operator">=</span> <span class="hljs-number">15</span> <span class="hljs-comment">// compiles</span>
<span class="hljs-keyword">let</span> bla <span class="hljs-operator">=</span> test&#x27;test <span class="hljs-comment">// compiles</span>
<span class="hljs-keyword">type</span> <span class="hljs-title class_">test&#x27;test</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> Test<span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-comment">// compiles</span>

<span class="hljs-keyword">let</span> <span class="hljs-variable">``type``</span> <span class="hljs-operator">=</span> <span class="hljs-string">&quot;hello&quot;</span> <span class="hljs-comment">// compiles</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">``type` is a keyword but I can use it in my &#x27;d funky \ \\ \n &quot; ^d binding``</span> <span class="hljs-operator">=</span> <span class="hljs-string">&quot;hello&quot;</span> <span class="hljs-comment">// compiles</span>

<span class="hljs-comment">// Type names (here with char) can be used to redefine bindings:</span>
<span class="hljs-keyword">let</span> char <span class="hljs-operator">:</span> <span class="hljs-type">char</span> <span class="hljs-operator">=</span>
    <span class="hljs-keyword">let</span> char <span class="hljs-operator">=</span> <span class="hljs-built_in">box</span> (char <span class="hljs-string">&quot;a&quot;</span>)
    <span class="hljs-keyword">let</span> result <span class="hljs-operator">=</span> <span class="hljs-built_in">unbox</span><span class="hljs-operator">&lt;</span>char<span class="hljs-operator">&gt;</span> char
    <span class="hljs-keyword">try</span> ()
    <span class="hljs-keyword">with</span> <span class="hljs-operator">|</span> <span class="hljs-operator">:?</span> ArgumentException <span class="hljs-operator">-&gt;</span> <span class="hljs-built_in">failwith</span> <span class="hljs-string">&quot;...&quot;</span>
    result

<span class="hljs-comment">// All the following type annotation examples are valid F#</span>
<span class="hljs-keyword">type</span> <span class="hljs-variable">``my = type``</span> <span class="hljs-operator">=</span> {a<span class="hljs-operator">:</span><span class="hljs-type">string</span>}
<span class="hljs-keyword">let</span> x <span class="hljs-operator">:</span> <span class="hljs-type">char</span> <span class="hljs-type">array</span> <span class="hljs-operator">=</span> [<span class="hljs-operator">|</span><span class="hljs-string">&#x27;a&#x27;</span><span class="hljs-operator">|</span>]
<span class="hljs-keyword">let</span> f f&#x27; <span class="hljs-operator">=</span> f&#x27; () <span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;returnType</span> <span class="hljs-comment">// the type annotation should end now</span>
<span class="hljs-keyword">and</span> <span class="hljs-built_in">not</span> color this <span class="hljs-keyword">as</span> a <span class="hljs-keyword">type</span>. <span class="hljs-keyword">let</span>&#x27;s <span class="hljs-keyword">end</span> this <span class="hljs-keyword">with</span> an <span class="hljs-keyword">end</span> pattern<span class="hljs-operator">:</span> <span class="hljs-operator">=</span>
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> <span class="hljs-type">int</span>, (b<span class="hljs-operator">:</span> <span class="hljs-type">string</span>)) <span class="hljs-operator">=</span> ()
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> <span class="hljs-type">int</span>, b<span class="hljs-operator">:</span> <span class="hljs-type">string</span>) <span class="hljs-operator">=</span> ()
<span class="hljs-keyword">let</span> anonymousRecordAnnotation <span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> <span class="hljs-type">string</span>; Y<span class="hljs-operator">:</span> <span class="hljs-type">int</span> <span class="hljs-type">array</span> <span class="hljs-operator">*</span> <span class="hljs-type">string</span> <span class="hljs-operator">|</span>} <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>
<span class="hljs-keyword">let</span> nested <span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> <span class="hljs-type">string</span>; Y<span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> Nested<span class="hljs-operator">:</span> <span class="hljs-type">bool</span> <span class="hljs-operator">|</span>} <span class="hljs-operator">|</span>} <span class="hljs-operator">=</span> ()
<span class="hljs-keyword">let</span> test (a<span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> <span class="hljs-type">string</span>; <span class="hljs-comment">(* this is a comment *)</span> Y<span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> Nested<span class="hljs-operator">:</span> <span class="hljs-type">bool</span> <span class="hljs-operator">|</span>} <span class="hljs-operator">|</span>}) <span class="hljs-operator">=</span> ()
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> (<span class="hljs-type">string</span>[])) <span class="hljs-operator">=</span> a
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> <span class="hljs-type">int</span> <span class="hljs-operator">-&gt;</span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">string</span>) <span class="hljs-operator">-&gt;</span> <span class="hljs-type">string</span>) (b<span class="hljs-operator">:</span> (<span class="hljs-symbol">&#x27;a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span> <span class="hljs-operator">-&gt;</span> _ <span class="hljs-operator">-&gt;</span> ``my = type`` <span class="hljs-operator">-&gt;</span> {<span class="hljs-operator">|</span> Prop<span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;``quoted``</span><span class="hljs-operator">|</span>}) <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span> <span class="hljs-type">list</span>) <span class="hljs-operator">=</span> a
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> (<span class="hljs-symbol">&#x27;a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span>) <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span> <span class="hljs-type">list</span> <span class="hljs-operator">-&gt;</span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">string</span>) <span class="hljs-operator">-&gt;</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-operator">|</span>}) <span class="hljs-operator">:</span> _ <span class="hljs-operator">*</span> (<span class="hljs-type">int</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">unit</span>) <span class="hljs-operator">=</span> a, (<span class="hljs-keyword">fun</span> x <span class="hljs-operator">-&gt;</span> ())
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> (<span class="hljs-symbol">&#x27;a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span>) <span class="hljs-comment">// multiline! (currently not supported)</span>
          <span class="hljs-operator">-&gt;</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> (<span class="hljs-type">int</span> <span class="hljs-operator">-&gt;</span> {<span class="hljs-operator">|</span> Y<span class="hljs-operator">:</span> (<span class="hljs-type">string</span> <span class="hljs-operator">-&gt;</span> (<span class="hljs-type">unit</span> <span class="hljs-comment">(*this is getting*)</span>)<span class="hljs-comment">(*really nested...*)</span>); A<span class="hljs-operator">:</span> ``my = type`` <span class="hljs-operator">|</span>}) <span class="hljs-operator">|</span>}
          <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span> list <span class="hljs-operator">-&gt;</span> (unit <span class="hljs-operator">-&gt;</span> string) <span class="hljs-operator">-&gt;</span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-operator">|</span>}) <span class="hljs-operator">=</span> a
<span class="hljs-keyword">let</span> test <span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-comment">(* this is a comment *)</span> <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>
<span class="hljs-keyword">let</span> f (a<span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;a</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;a</span> <span class="hljs-operator">:</span> <span class="hljs-literal">null</span>, b<span class="hljs-operator">:</span> <span class="hljs-type">string</span>) <span class="hljs-operator">=</span> ()
<span class="hljs-keyword">let</span> iterate2 (f <span class="hljs-operator">:</span> <span class="hljs-type">unit</span> <span class="hljs-operator">-&gt;</span> #<span class="hljs-type">seq</span><span class="hljs-operator">&lt;</span><span class="hljs-type">int</span><span class="hljs-operator">&gt;</span>) <span class="hljs-operator">=</span>
    <span class="hljs-keyword">for</span> e <span class="hljs-keyword">in</span> f() <span class="hljs-keyword">do</span> <span class="hljs-built_in">printfn</span> <span class="hljs-string">&quot;%d&quot;</span> e
<span class="hljs-keyword">type</span> <span class="hljs-title class_">record</span> <span class="hljs-operator">=</span>
    { X<span class="hljs-operator">:</span> <span class="hljs-type">int</span> <span class="hljs-operator">-&gt;</span> (<span class="hljs-symbol">&#x27;a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span>) <span class="hljs-operator">-&gt;</span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">string</span>) <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">&#x27;b</span> <span class="hljs-type">list</span> <span class="hljs-comment">// comment</span>
      Y<span class="hljs-operator">:</span> {<span class="hljs-operator">|</span> Bla<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-comment">(*comment*)</span> <span class="hljs-type">array</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">unit</span> <span class="hljs-operator">|</span>} }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">record</span> <span class="hljs-operator">=</span>
    { X<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-comment">// comment</span>
      Y<span class="hljs-operator">:</span> {<span class="hljs-operator">|</span>
            Bla<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-comment">(*comment*)</span> <span class="hljs-type">array</span>
                 <span class="hljs-operator">-&gt;</span> unit <span class="hljs-operator">|</span>} }

<span class="hljs-keyword">type</span> <span class="hljs-title class_">FancyClass</span>(thing<span class="hljs-operator">:</span><span class="hljs-type">int</span>, var2 <span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">string</span>, ``ddzdz``<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-type">list</span>, extra) <span class="hljs-keyword">as</span> xxx <span class="hljs-operator">=</span>

    <span class="hljs-keyword">let</span> pf() <span class="hljs-operator">=</span> xxx.Test()
    <span class="hljs-keyword">let</span> <span class="hljs-keyword">mutable</span> myInternalValue <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>

    <span class="hljs-keyword">member</span> xxx.Test() <span class="hljs-operator">=</span> <span class="hljs-string">&quot;F#&quot;</span>

    <span class="hljs-comment">// A read-only property.</span>
    <span class="hljs-keyword">member</span> __.MyReadOnlyProperty <span class="hljs-operator">=</span> myInternalValue
    <span class="hljs-comment">// A write-only property.</span>
    <span class="hljs-keyword">member</span> __.MyWriteOnlyProperty <span class="hljs-keyword">with</span> <span class="hljs-built_in">set</span> (value) <span class="hljs-operator">=</span> myInternalValue <span class="hljs-operator">&lt;-</span> value
    <span class="hljs-comment">// A read-write property.</span>
    <span class="hljs-keyword">member</span> __.MyReadWriteProperty
        <span class="hljs-keyword">with</span> <span class="hljs-built_in">get</span> () <span class="hljs-operator">=</span> myInternalValue
        <span class="hljs-keyword">and</span> <span class="hljs-built_in">set</span> (value) <span class="hljs-operator">=</span> myInternalValue <span class="hljs-operator">&lt;-</span> value

    <span class="hljs-keyword">member</span> __.ReadAndWriteWithSignature
        <span class="hljs-keyword">with</span> <span class="hljs-built_in">get</span> (count <span class="hljs-operator">:</span> <span class="hljs-type">int</span>) <span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-operator">=</span> string count
        <span class="hljs-keyword">and</span> <span class="hljs-built_in">set</span> (value <span class="hljs-operator">:</span> <span class="hljs-type">int</span>) <span class="hljs-operator">:</span> <span class="hljs-type">unit</span> <span class="hljs-operator">=</span> <span class="hljs-built_in">failwith</span> <span class="hljs-string">&quot;&quot;</span>

    <span class="hljs-keyword">member</span> __.MyReadWriteProperty <span class="hljs-keyword">with</span> <span class="hljs-built_in">get</span> () <span class="hljs-operator">=</span> myInternalValue
    <span class="hljs-keyword">member</span> __.MyReadWriteProperty <span class="hljs-keyword">with</span> <span class="hljs-built_in">set</span> (value) <span class="hljs-operator">=</span> myInternalValue <span class="hljs-operator">&lt;-</span> value

    <span class="hljs-keyword">abstract</span> Update <span class="hljs-operator">:</span> <span class="hljs-type">int</span> <span class="hljs-operator">*</span> <span class="hljs-type">string</span> <span class="hljs-operator">*</span> <span class="hljs-type">string</span> <span class="hljs-type">option</span> <span class="hljs-operator">*</span> <span class="hljs-type">obj</span> <span class="hljs-operator">-&gt;</span> FancyClass
    <span class="hljs-keyword">default</span> this.Update (thing<span class="hljs-operator">:</span><span class="hljs-type">int</span>, var2 <span class="hljs-operator">:</span> <span class="hljs-type">string</span>, ``name with spaces``<span class="hljs-operator">:</span> <span class="hljs-type">string</span> <span class="hljs-type">option</span>, extra) <span class="hljs-operator">=</span> this

    <span class="hljs-keyword">member</span> <span class="hljs-keyword">val</span> Property1 <span class="hljs-operator">=</span> thing
    <span class="hljs-keyword">member</span> <span class="hljs-keyword">val</span> Property2 <span class="hljs-operator">=</span> <span class="hljs-string">&quot;&quot;</span> <span class="hljs-keyword">with</span> <span class="hljs-built_in">get</span>, <span class="hljs-built_in">set</span>

<span class="hljs-comment">// Testing for generic parameters highlighting:</span>

<span class="hljs-keyword">type</span> <span class="hljs-title class_">Ref</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span>
{ <span class="hljs-keyword">mutable</span> contents<span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;a</span> }

<span class="hljs-keyword">type</span> <span class="hljs-title class_">Bla</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> {X<span class="hljs-operator">:</span> <span class="hljs-type">string</span>}
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Blah</span><span class="hljs-operator">&lt;</span>
         <span class="hljs-symbol">&#x27;a</span>
         <span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> { x<span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;a</span> }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Blah</span> <span class="hljs-operator">&lt;</span>
          <span class="hljs-symbol">&#x27;a</span>
          <span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> { x<span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;a</span> }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Bla</span>  <span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> {X<span class="hljs-operator">:</span> <span class="hljs-type">string</span>}
<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> asdf x<span class="hljs-operator">:</span> Bla<span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;a</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-string">&quot;&quot;</span>}

<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> asdf x<span class="hljs-operator">:</span> Bla<span class="hljs-operator">&lt;^</span>a<span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-string">&quot;&quot;</span>}
<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> asdf x<span class="hljs-operator">:</span> Bla<span class="hljs-operator">&lt;</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-string">&quot;&quot;</span>}

<span class="hljs-keyword">let</span> a <span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;``asdf``</span>_asdf <span class="hljs-operator">=</span> () <span class="hljs-comment">// This is not valid and should not be parsed as a single generic type symbol</span>

<span class="hljs-keyword">type</span> <span class="hljs-title class_">MyType</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;T</span> <span class="hljs-operator">:</span> <span class="hljs-literal">null</span><span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>
<span class="hljs-keyword">type</span> <span class="hljs-title class_">MyType</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;T</span> <span class="hljs-operator">:</span> unmanaged<span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>
<span class="hljs-keyword">type</span> <span class="hljs-title class_">MyType</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;T</span> <span class="hljs-operator">:</span> (<span class="hljs-keyword">member</span> Method1 <span class="hljs-operator">:</span> <span class="hljs-symbol">&#x27;T</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">int</span>)<span class="hljs-operator">&gt;</span> <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>
<span class="hljs-keyword">type</span> <span class="hljs-title class_">MyType</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">&#x27;T</span> <span class="hljs-operator">:</span> <span class="hljs-keyword">delegate</span><span class="hljs-operator">&lt;</span><span class="hljs-type">obj</span> <span class="hljs-operator">*</span> System.EventArgs, <span class="hljs-type">unit</span><span class="hljs-operator">&gt;&gt;</span> <span class="hljs-operator">=</span> <span class="hljs-operator">...</span>

<span class="hljs-keyword">let</span> genericSumUnits ( x <span class="hljs-operator">:</span> <span class="hljs-type">float</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;u</span><span class="hljs-operator">&gt;</span>) (y<span class="hljs-operator">:</span> <span class="hljs-type">float</span><span class="hljs-operator">&lt;</span><span class="hljs-symbol">&#x27;u</span><span class="hljs-operator">&gt;</span>) <span class="hljs-operator">=</span> x <span class="hljs-operator">+</span> y

<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> konst x _ <span class="hljs-operator">=</span> x

<span class="hljs-keyword">type</span> <span class="hljs-title class_">CFunctor</span>() <span class="hljs-operator">=</span>
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> <span class="hljs-keyword">inline</span> fmap (f<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^b</span>, a<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-type">list</span>) <span class="hljs-operator">=</span> List.map f a
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> <span class="hljs-keyword">inline</span> fmap (f<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^b</span>, a<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-type">option</span>) <span class="hljs-operator">=</span>
        <span class="hljs-keyword">match</span> a <span class="hljs-keyword">with</span>
        <span class="hljs-operator">|</span> <span class="hljs-literal">None</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-literal">None</span>
        <span class="hljs-operator">|</span> <span class="hljs-literal">Some</span> x <span class="hljs-operator">-&gt;</span> <span class="hljs-literal">Some</span> (f x)

    <span class="hljs-comment">// default implementation of replace</span>
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> <span class="hljs-keyword">inline</span> replace<span class="hljs-operator">&lt;</span> <span class="hljs-symbol">^a</span>, <span class="hljs-symbol">^b</span>, <span class="hljs-symbol">^c</span>, <span class="hljs-symbol">^d</span>, <span class="hljs-symbol">^e</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">:&gt;</span> CFunctor <span class="hljs-keyword">and</span> (<span class="hljs-symbol">^a</span> <span class="hljs-keyword">or</span> <span class="hljs-symbol">^d</span>)<span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> fmap<span class="hljs-operator">:</span> (<span class="hljs-symbol">^b</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^c</span>) <span class="hljs-operator">*</span> <span class="hljs-symbol">^d</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^e</span>) <span class="hljs-operator">&gt;</span> (a, f) <span class="hljs-operator">=</span>
        ((<span class="hljs-symbol">^a</span> <span class="hljs-keyword">or</span> <span class="hljs-symbol">^d</span>) <span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> fmap <span class="hljs-operator">:</span> (<span class="hljs-symbol">^b</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^c</span>) <span class="hljs-operator">*</span> <span class="hljs-symbol">^d</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^e</span>) (konst a, f))

    <span class="hljs-comment">// call overridden replace if present</span>
    <span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> <span class="hljs-keyword">inline</span> replace<span class="hljs-operator">&lt;</span> <span class="hljs-symbol">^a</span>, <span class="hljs-symbol">^b</span>, <span class="hljs-symbol">^c</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">^b</span><span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> replace<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">*</span> <span class="hljs-symbol">^b</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^c</span>)<span class="hljs-operator">&gt;</span>(a<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span>, f<span class="hljs-operator">:</span> <span class="hljs-symbol">^b</span>) <span class="hljs-operator">=</span>
        (<span class="hljs-symbol">^b</span> <span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> replace<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">*</span> <span class="hljs-symbol">^b</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^c</span>) (a, f))

<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> replace_instance<span class="hljs-operator">&lt;</span> <span class="hljs-symbol">^a</span>, <span class="hljs-symbol">^b</span>, <span class="hljs-symbol">^c</span>, <span class="hljs-symbol">^d</span> <span class="hljs-keyword">when</span> (<span class="hljs-symbol">^a</span> <span class="hljs-keyword">or</span> <span class="hljs-symbol">^c</span>)<span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> replace<span class="hljs-operator">:</span> <span class="hljs-symbol">^b</span> <span class="hljs-operator">*</span> <span class="hljs-symbol">^c</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^d</span>)<span class="hljs-operator">&gt;</span> (a<span class="hljs-operator">:</span> <span class="hljs-symbol">^b</span>, f<span class="hljs-operator">:</span> <span class="hljs-symbol">^c</span>) <span class="hljs-operator">=</span>
        ((<span class="hljs-symbol">^a</span> <span class="hljs-keyword">or</span> <span class="hljs-symbol">^c</span>)<span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> replace<span class="hljs-operator">:</span> <span class="hljs-symbol">^b</span> <span class="hljs-operator">*</span> <span class="hljs-symbol">^c</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-symbol">^d</span>) (a, f))

<span class="hljs-comment">// Note the concrete type &#x27;CFunctor&#x27; specified in the signature</span>
<span class="hljs-keyword">let</span> <span class="hljs-keyword">inline</span> replace (a<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span>) (f<span class="hljs-operator">:</span> <span class="hljs-symbol">^b</span>)<span class="hljs-operator">:</span> <span class="hljs-symbol">^a0</span> <span class="hljs-keyword">when</span> (CFunctor <span class="hljs-keyword">or</span>  <span class="hljs-symbol">^b</span>)<span class="hljs-operator">:</span> (<span class="hljs-keyword">static</span> <span class="hljs-keyword">member</span> replace<span class="hljs-operator">:</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">*</span>  <span class="hljs-symbol">^b</span> <span class="hljs-operator">-&gt;</span>  <span class="hljs-symbol">^a0</span>) <span class="hljs-operator">=</span>
    replace_instance<span class="hljs-operator">&lt;</span>CFunctor, _, _, _<span class="hljs-operator">&gt;</span> (a, f)

<span class="hljs-keyword">type</span> <span class="hljs-title class_">DUType</span> <span class="hljs-operator">=</span>
    <span class="hljs-operator">|</span> CaseA
    <span class="hljs-operator">|</span> CaseB <span class="hljs-keyword">of</span> <span class="hljs-type">int</span>
    <span class="hljs-operator">|</span> CaseC <span class="hljs-keyword">of</span> (<span class="hljs-type">int</span> <span class="hljs-operator">*</span> (<span class="hljs-type">string</span> <span class="hljs-operator">*</span> <span class="hljs-type">string</span>) <span class="hljs-type">list</span>)
    <span class="hljs-operator">|</span> CaseD <span class="hljs-keyword">of</span> name <span class="hljs-operator">:</span><span class="hljs-type">string</span> <span class="hljs-operator">*</span> age<span class="hljs-operator">:</span><span class="hljs-type">int</span>
    <span class="hljs-operator">|</span> CaseE <span class="hljs-keyword">of</span> client<span class="hljs-operator">:</span> Client
    <span class="hljs-operator">|</span> CaseF <span class="hljs-keyword">of</span> client<span class="hljs-operator">:</span> Client <span class="hljs-comment">(*comment tests*)</span> <span class="hljs-operator">*</span> <span class="hljs-comment">(*comment tests*)</span> <span class="hljs-type">string</span> <span class="hljs-operator">*</span> port <span class="hljs-operator">:</span> <span class="hljs-type">int</span>
    <span class="hljs-operator">|</span> CaseG <span class="hljs-keyword">of</span> (<span class="hljs-type">obj</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">unit</span>)
    <span class="hljs-operator">|</span> CaseH <span class="hljs-keyword">of</span> <span class="hljs-type">string</span> <span class="hljs-operator">*</span> (<span class="hljs-type">obj</span> <span class="hljs-operator">-&gt;</span> <span class="hljs-type">unit</span>)
    <span class="hljs-comment">// Check multiple declaration on one line</span>
    <span class="hljs-operator">|</span> CaseI <span class="hljs-keyword">of</span> <span class="hljs-type">int</span> <span class="hljs-operator">|</span> CaseJ <span class="hljs-keyword">of</span> <span class="hljs-type">int</span>
    <span class="hljs-operator">|</span> CaseF2 <span class="hljs-keyword">of</span> client<span class="hljs-operator">:</span> Client <span class="hljs-comment">// * string * port : int</span>
    <span class="hljs-operator">|</span> FetchDomainsSuccess <span class="hljs-keyword">of</span> <span class="hljs-type">Result</span><span class="hljs-operator">&lt;</span><span class="hljs-type">int</span> <span class="hljs-type">list</span> <span class="hljs-operator">*</span> ``type with spaces`` <span class="hljs-operator">*</span> <span class="hljs-type">int</span>, ``type * with * spaces``<span class="hljs-operator">&gt;</span>
    <span class="hljs-operator">|</span> CaseK <span class="hljs-keyword">of</span> ``var with spaces``<span class="hljs-operator">:</span> <span class="hljs-type">string</span>
    <span class="hljs-operator">|</span> CaseL <span class="hljs-keyword">of</span> ``var with spaces``<span class="hljs-operator">:</span> ``type with spaces``
    <span class="hljs-operator">|</span> CaseM <span class="hljs-keyword">of</span> v1 <span class="hljs-operator">:</span> ``type with spaces``
    <span class="hljs-operator">|</span> CaseN <span class="hljs-keyword">of</span> ``type with spaces``
