Formerly Morgan-Stanley/morphir-elm. Search finds this package by either name.
This module contains the building blocks of types in the Morphir IR.
Creates a type variable.
toIR a == variable [ "a" ] ()
toIR fooBar == variable [ "foo", "bar" ] ()Creates a fully-qualified reference to a type.
toIR (List Int)
== reference SDK.List.listType [ intType ]
toIR Foo.Bar
== reference
( [ [ "my" ], [ "lib" ] ], [ [ "foo" ] ], [ "bar" ] )
[]Creates a tuple type.
toIR ( Int, Bool )
== tuple [ basic intType, basic boolType ]Creates a record type.
toIR {} == record []
toIR { foo = Int }
== record
[ field [ "foo" ] SDK.Basics.intType
]
toIR { foo = Int, bar = Bool }
== record
[ field [ "foo" ] SDK.Basics.intType
, field [ "bar" ] SDK.Basics.boolType
]Creates an extensible record type.
toIR { e | foo = Int }
== extensibleRecord (variable [ "e" ])
[ field [ "foo" ] intType
]
toIR { f | foo = Int, bar = Bool }
== extensibleRecord (variable [ "f" ])
[ field [ "foo" ] intType
, field [ "bar" ] boolType
]Creates a function type. Use currying to create functions with more than one argument.
toIR (Int -> Bool) ==
function
SDK.Basics.intType
SDK.Basics.boolType
toIR (Int -> Bool -> Char) ==
function
intType
(function
SDK.Basics.boolType
SDK.Basics.charType
)An opaque representation of a field. It's made up of a name and a type.
Map the name of the field to get a new field.
Map the type of the field to get a new field.
This syntax represents a type definition. For example:
type alias Foo a = {bar : Maybe a, qux : Int}type MyList a = End | Cons a (MyList a)In the definition, the List Name refers to type parameters on the LHS
and Type extra refers to the RHS
Collect all variables in a type recursively.
Represents a type expression that can appear in various places within the IR. It can be the right-hand-side of a type alias declaration, input and output types of a function or as an annotation on values after type inference is done.
Type are modeled as expression trees: a recursive data structure with various node types. The type argument
aallows us to assign some additional attributes to each node in the tree. Here are some details on each node type in the tree:Int,String, ...) don't have an associated definition.Unit.a -> b -> cis represented asa -> (b -> c)