<span class="hljs-comment">// Testing type definition and type annotation highlighting:</span>
<span class="hljs-keyword">let</span> test'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'test <span class="hljs-comment">// compiles</span>
<span class="hljs-keyword">type</span> <span class="hljs-title class_">test'test</span><span class="hljs-operator"><</span><span class="hljs-symbol">'a</span><span class="hljs-operator">></span> <span class="hljs-operator">=</span> Test<span class="hljs-operator"><</span><span class="hljs-symbol">'a</span><span class="hljs-operator">></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">"hello"</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 'd funky \ \\ \n " ^d binding``</span> <span class="hljs-operator">=</span> <span class="hljs-string">"hello"</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">"a"</span>)
<span class="hljs-keyword">let</span> result <span class="hljs-operator">=</span> <span class="hljs-built_in">unbox</span><span class="hljs-operator"><</span>char<span class="hljs-operator">></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">-></span> <span class="hljs-built_in">failwith</span> <span class="hljs-string">"..."</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">'a'</span><span class="hljs-operator">|</span>]
<span class="hljs-keyword">let</span> f f' <span class="hljs-operator">=</span> f' () <span class="hljs-operator">:</span> <span class="hljs-symbol">'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>'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">-></span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-></span> <span class="hljs-type">string</span>) <span class="hljs-operator">-></span> <span class="hljs-type">string</span>) (b<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">-></span> _ <span class="hljs-operator">-></span> ``my = type`` <span class="hljs-operator">-></span> {<span class="hljs-operator">|</span> Prop<span class="hljs-operator">:</span> <span class="hljs-symbol">'``quoted``</span><span class="hljs-operator">|</span>}) <span class="hljs-operator">-></span> <span class="hljs-symbol">'a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">'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">'a</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">'b</span>) <span class="hljs-operator">-></span> <span class="hljs-symbol">'a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">'b</span> <span class="hljs-type">list</span> <span class="hljs-operator">-></span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-></span> <span class="hljs-type">string</span>) <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-operator">|</span>}) <span class="hljs-operator">:</span> _ <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> a, (<span class="hljs-keyword">fun</span> x <span class="hljs-operator">-></span> ())
<span class="hljs-keyword">let</span> f (a<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-comment">// multiline! (currently not supported)</span>
<span class="hljs-operator">-></span> {<span class="hljs-operator">|</span> X<span class="hljs-operator">:</span> (<span class="hljs-type">int</span> <span class="hljs-operator">-></span> {<span class="hljs-operator">|</span> Y<span class="hljs-operator">:</span> (<span class="hljs-type">string</span> <span class="hljs-operator">-></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">-></span> <span class="hljs-symbol">'b</span> list <span class="hljs-operator">-></span> (unit <span class="hljs-operator">-></span> string) <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-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">'a</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">'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">-></span> #<span class="hljs-type">seq</span><span class="hljs-operator"><</span><span class="hljs-type">int</span><span class="hljs-operator">></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">"%d"</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">-></span> (<span class="hljs-symbol">'a</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">'b</span>) <span class="hljs-operator">-></span> (<span class="hljs-type">unit</span> <span class="hljs-operator">-></span> <span class="hljs-type">string</span>) <span class="hljs-operator">-></span> <span class="hljs-symbol">'a</span> <span class="hljs-type">list</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">'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">-></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">-></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">-></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">"F#"</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"><-</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"><-</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">""</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"><-</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">-></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">""</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"><</span><span class="hljs-symbol">'a</span><span class="hljs-operator">></span> <span class="hljs-operator">=</span>
{ <span class="hljs-keyword">mutable</span> contents<span class="hljs-operator">:</span> <span class="hljs-symbol">'a</span> }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Bla</span><span class="hljs-operator"><</span><span class="hljs-symbol">'a</span><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-keyword">type</span> <span class="hljs-title class_">Blah</span><span class="hljs-operator"><</span>
<span class="hljs-symbol">'a</span>
<span class="hljs-operator">></span> <span class="hljs-operator">=</span> { x<span class="hljs-operator">:</span> <span class="hljs-symbol">'a</span> }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Blah</span> <span class="hljs-operator"><</span>
<span class="hljs-symbol">'a</span>
<span class="hljs-operator">></span> <span class="hljs-operator">=</span> { x<span class="hljs-operator">:</span> <span class="hljs-symbol">'a</span> }
<span class="hljs-keyword">type</span> <span class="hljs-title class_">Bla</span> <span class="hljs-operator"><</span><span class="hljs-symbol">'a</span><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-keyword">let</span> <span class="hljs-keyword">inline</span> asdf x<span class="hljs-operator">:</span> Bla<span class="hljs-operator"><</span><span class="hljs-symbol">'a</span><span class="hljs-operator">></span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-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"><^</span>a<span class="hljs-operator">></span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-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"><</span> <span class="hljs-symbol">^a</span> <span class="hljs-operator">></span> <span class="hljs-operator">=</span> {X <span class="hljs-operator">=</span> <span class="hljs-string">""</span>}
<span class="hljs-keyword">let</span> a <span class="hljs-operator">:</span> <span class="hljs-symbol">'``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"><</span><span class="hljs-symbol">'T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">'T</span> <span class="hljs-operator">:</span> <span class="hljs-literal">null</span><span class="hljs-operator">></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"><</span><span class="hljs-symbol">'T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">'T</span> <span class="hljs-operator">:</span> unmanaged<span class="hljs-operator">></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"><</span><span class="hljs-symbol">'T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">'T</span> <span class="hljs-operator">:</span> (<span class="hljs-keyword">member</span> Method1 <span class="hljs-operator">:</span> <span class="hljs-symbol">'T</span> <span class="hljs-operator">-></span> <span class="hljs-type">int</span>)<span class="hljs-operator">></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"><</span><span class="hljs-symbol">'T</span> <span class="hljs-keyword">when</span> <span class="hljs-symbol">'T</span> <span class="hljs-operator">:</span> <span class="hljs-keyword">delegate</span><span class="hljs-operator"><</span><span class="hljs-type">obj</span> <span class="hljs-operator">*</span> System.EventArgs, <span class="hljs-type">unit</span><span class="hljs-operator">>></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"><</span><span class="hljs-symbol">'u</span><span class="hljs-operator">></span>) (y<span class="hljs-operator">:</span> <span class="hljs-type">float</span><span class="hljs-operator"><</span><span class="hljs-symbol">'u</span><span class="hljs-operator">></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">-></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">-></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">-></span> <span class="hljs-literal">None</span>
<span class="hljs-operator">|</span> <span class="hljs-literal">Some</span> x <span class="hljs-operator">-></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"><</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">:></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">-></span> <span class="hljs-symbol">^c</span>) <span class="hljs-operator">*</span> <span class="hljs-symbol">^d</span> <span class="hljs-operator">-></span> <span class="hljs-symbol">^e</span>) <span class="hljs-operator">></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">-></span> <span class="hljs-symbol">^c</span>) <span class="hljs-operator">*</span> <span class="hljs-symbol">^d</span> <span class="hljs-operator">-></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"><</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">-></span> <span class="hljs-symbol">^c</span>)<span class="hljs-operator">></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">-></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"><</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">-></span> <span class="hljs-symbol">^d</span>)<span class="hljs-operator">></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">-></span> <span class="hljs-symbol">^d</span>) (a, f))
<span class="hljs-comment">// Note the concrete type 'CFunctor' 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">-></span> <span class="hljs-symbol">^a0</span>) <span class="hljs-operator">=</span>
replace_instance<span class="hljs-operator"><</span>CFunctor, _, _, _<span class="hljs-operator">></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">-></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">-></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"><</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">></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``