CSL language change: Pattern matches must be exhaustive¶
CSL pattern matches must now cover all potential cases. For instance, the following contract is no longer permitted:
contract c = \ 0 -> success | 1 -> <*> e : Event then success | 2 -> <*> e : Event then <*> e : Event then success
CSL provides the following message:
Missing cases: 3, 4, 5
CSL Visual Studio Code extension: Support for code completion¶
The CSL VSCode extension now provides completions for record projections, definitions, and record construction snippets.
Explicit type variable binders and type variables in type annotations¶
While CSL has always supported polymorphic  definitions, it has so far not been possible to write polymorphic type signatures. For example:
val my_id = \x -> x // my_id has type a -> a val my_id2 : a -> a = \x -> x // Not allowed because a is not the name of a type
The second definition is now valid, but it requires the type variables to first be explicitly bound. Here are a few examples of how definitions can now be given type signatures.
// <a> explicitly puts a into scope of the type signature val <a> myId : a -> a = \x -> x // also valid val <a> myId2 = \(x : a) -> x // Multiple type variables can be bound val <t, u> myConst : t -> u -> t = \x -> \_ -> x // Contract and template definitions can also bind type variables contract <a> myContract = \(x: a) -> success template <a> MyTemplate (x: a) = success
|||The term “generic” is often used instead of polymorphic. The two terms can be considered equivalent here.|