language-ext v3.3.43 Release Notes
Release Date: 2019-12-10 // over 4 years ago-
0️⃣ Language-ext was created before the C# pattern-matching feature existed. The default way to match within lang-ext is to use the
Match(...)
methods provided for most types.👍 There have been requests for the
struct
types to become reference-types so sub-types can represent the cases of types likeOption<A>
,Either<L, R>
, etc. I don't think this is the best way forward for a number of reasons that I won't go in to here, but it would obviously be good to support the C# in-built pattern-matching.So, now most types have a
Case
property, or in the case ofdelegate
types likeTry<A>
, or in-built BCL types likeTask<T>
: aCase()
extension method.For example, this is how to match on an
Option<int>
:var option = Some(123);var result = option.Case switch{ SomeCase\<int\>(var x) =\> x, \_=\> 0// None};
Next we can try matching on an
Either<string, int>
:var either = Right\<string, int\>(123);var result = either.Case switch{ RightCase\<string, int\>(var r) =\> r, LeftCase\<string, int\>(var \_) =\> 0, \_=\> 0// Bottom};
This is where some of the issues of C#'s pattern-matching show up, they can get quite verbose compared to calling the
Match
method.For
async
types you simply have toawait
theCase
:var either = RightAsync\<string, int\>(123);var result = await either.Case switch{ RightCase\<string, int\>(var r) =\> r, LeftCase\<string, int\>(var \_) =\> 0, \_=\> 0// Bottom};
The delegate types need to use
Case()
rather thanCase
:var tryOption = TryOption\<int\>(123);var result = tryOption.Case() switch{ SuccCase\<int\>(var r) =\> r, FailCase\<int\>(var \_) =\> 0, \_=\> 0// None};
👍 All collection types support
Case
also, they all work with the same matching system and so the cases are always the same for all collection types:static int Sum(Seq\<int\> seq) =\>seq.Case switch { HeadCase\<int\>(var x) =\> x, HeadTailCase\<int\>(var x, var xs) =\> x + Sum(xs), \_=\> 0// Empty };