At this point, a pair of matching code examples, one in SML, one in Mythryl, should give good intuition. First the SML version:
signature My_Api = sig sumtype Color = RED | GREEN | BLUE sumtype Point = TWO_D of (real * real) | THREE_D of (real * real * realt) val say_hello: unit -> unit val dist: ((real * real) * (real * real)) -> real val sum: int list -> int end structure my_package :> My_Api = struct sumtype Color = RED | GREEN | BLUE sumtype Point = TWO_D of (real * real) | THREE_D of (real * real * real) fun say_hello () = print "Hello!\n" fun dist ((x0,y0), (x1,y1)) = let val delta_x = x1 - x0 val delta_y = y1 - y0 in delta_x * delta_x + delta_y * delta_y end fun sum ints = let fun sum' ([], result) => result | sum' (i :: is, result) => sum' (is, i + result) in sum' (ints, 0) end end
Now the Mythryl version:
api My_Api { Color = RED | GREEN | BLUE; Point = TWO_D (Float, Float) | THREE_D (Float, Float, Float); say_hello: Void -> Void; mult: (Int, Int) -> Int; sum: ((Float,Float), (Float,Float)) -> Float; }; package my_package: My_Api { Color = RED | GREEN | BLUE; Point = TWO_D (Float, Float) | THREE_D (Float, Float, Float); fun say_hello () = print "Hello!\n"; fun dist ((x0,y0), (x1,y1)) = { delta_x = x1 - x0; delta_y = y1 - y0; delta_x * delta_x + delta_y * delta_y; }; fun sum ints = sum' (ints, 0) where fun sum' ([], result) => result; sum' (i ! is, result) => sum' (is, i + result); end; end; };