Functional.Monad
0.7.1
dotnet add package Functional.Monad --version 0.7.1
NuGet\Install-Package Functional.Monad -Version 0.7.1
<PackageReference Include="Functional.Monad" Version="0.7.1" />
<PackageVersion Include="Functional.Monad" Version="0.7.1" />
<PackageReference Include="Functional.Monad" />
paket add Functional.Monad --version 0.7.1
#r "nuget: Functional.Monad, 0.7.1"
#:package Functional.Monad@0.7.1
#addin nuget:?package=Functional.Monad&version=0.7.1
#tool nuget:?package=Functional.Monad&version=0.7.1
C# Functional Programming
Simple Option
and Result
monad implementation for C#.
Getting started
Use the global using
directive for the whole project:
global using Functional;
global using static Functional.Prelude;
Or the using
directive in a single file:
using Functional;
using static Functional.Prelude;
Option
monads support either some value, or no value; use Match
function to get value safely:
Option<int> some = Some(42);
Option<int> none = None;
int someValue = some.Match(Identity, 0);
int noneValue = none.Match(Identity, 0);
Assert.Equal(42, someValue);
Assert.Equal(0, noneValue);
Use Choose
function to convert a collection of Option
values to a collection of values:
List<Option<int>> input = [Some(1), None, Some(2)];
List<int> output = input.Choose(Identity);
Assert.Equal(2, output.Count);
Assert.Equal(1, output[0]);
Assert.Equal(2, output[1]);
Result
monads support either an ok value, or an error value; use Match
function to get value safely:
Result<int, string> ok = Ok(42);
Result<int, string> err = Err("There is no answer");
int okValue = ok.Match(Identity, 0);
int errValue = err.Match(Identity, 0);
string error = err.Match(value => value.ToString(), Identity);
Assert.Equal(42, okValue);
Assert.Equal(0, errValue);
Assert.Equal("There is no answer", error);
An Option
can be converted to a Result
Option<int> some = Some(42);
Option<int> none = None;
Result<int, string> ok = some.ToResult("There is no answer");
Result<int, string> err = none.ToResult(() => "There is no answer");
Assert.True(ok.IsOk);
Assert.True(err.IsErr);
Assert.Equal("There is no answer", err.ExpectError());
A Result
can be converted to an Option
:
Result<int, string> ok = Ok(42);
Result<int, string> err = Err("There is no answer");
Option<int> some = ok.ToOption();
Option<int> none = err.ToOption();
Assert.True(some.IsSome);
Assert.True(none.IsNone);
A nullable object can be converted to an Option
:
string? someString = "Forty two";
string? nullString = null;
Option<string> some = someString.ToOption();
Option<string> none = nullString.ToOption();
string someResult = some.Match(Identity, "none");
string noneResult = none.Match(Identity, "none");
Assert.Equal("Forty two", someResult);
Assert.Equal("none", noneResult);
A nullable value can be converted to an Option
:
int? someInt = 42;
int? nullInt = null;
Option<int> some = someInt.ToOption();
Option<int> none = nullInt.ToOption();
int someValue = some.Match(Identity, 0);
int noneValue = none.Match(Identity, 0);
Assert.Equal(42, someValue);
Assert.Equal(0, noneValue);
An Option
can be converted to a nullable object:
Option<string> some = Some("Forty two");
Option<string> none = None;
string? someValue = some.ToObject();
string? noneValue = none.ToObject();
Assert.Equal("Forty two", someValue);
Assert.Null(noneValue);
An Option
can be converted to a nullable value:
Option<int> some = Some(42);
Option<int> none = None;
int? someValue = some.ToNullable();
int? noneValue = none.ToNullable();
Assert.Equal(42, someValue);
Assert.False(noneValue.HasValue);
A Result
can be converted to a nullable object:
Result<string, string> ok = Ok("Forty two");
Result<string, string> err = Err("There is no answer");
string? okValue = ok.ToObject();
string? errValue = err.ToObject();
Assert.Equal("Forty two", okValue);
Assert.Null(errValue);
A Result
can be converted to a nullable value:
Result<int, string> ok = Ok(42);
Result<int, string> err = Err("There is no answer");
int? okValue = ok.ToNullable();
int? errValue = err.ToNullable();
Assert.Equal(42, okValue);
Assert.False(errValue.HasValue);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Functional.Monad:
Package | Downloads |
---|---|
Configuration.Ini
Simple INI parser and writer |
|
Functional.Monad.FSharp
Simple Option and Result monad implementation for C#, bridge to F# |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
0.7.1 | 120 | 9/12/2025 |
0.7.0 | 146 | 9/11/2025 |
0.6.0 | 144 | 9/9/2025 |
0.5.0 | 265 | 4/30/2025 |
0.4.2 | 161 | 4/28/2025 |
0.4.1 | 345 | 4/28/2025 |
0.4.0 | 336 | 4/28/2025 |
0.3.0 | 353 | 4/4/2025 |
0.2.0 | 191 | 4/2/2025 |
0.1.10 | 135 | 3/14/2025 |
0.1.9 | 289 | 3/11/2025 |
0.1.8 | 266 | 3/10/2025 |
0.1.7 | 266 | 3/8/2025 |
0.1.6 | 227 | 3/7/2025 |
0.1.5 | 273 | 3/6/2025 |
0.1.4 | 378 | 3/3/2025 |
0.1.3 | 151 | 3/3/2025 |
0.1.2 | 181 | 2/27/2025 |
0.1.1 | 115 | 2/27/2025 |