Created
December 27, 2015 16:37
-
-
Save matthewphilyaw/b20335bfeed298502293 to your computer and use it in GitHub Desktop.
Maybe Monad take 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace Maybe | |
{ | |
abstract class Maybe<T> { | |
public static Maybe<T> Return(T val) | |
{ | |
return new Just<T> (val); | |
} | |
#region Monad implementation | |
abstract public T Value (); | |
abstract public bool HasValue (); | |
abstract public Maybe<T> Bind (Func<T, Maybe<T>> f); | |
#endregion | |
} | |
class Just<T> : Maybe<T> | |
{ | |
private T _val; | |
public Just(T val) // <- Unit | |
{ | |
_val = val; | |
} | |
#region Maybe implementation | |
override public T Value () | |
{ | |
return _val; | |
} | |
override public bool HasValue() { return true; } | |
override public Maybe<T> Bind (Func<T, Maybe<T>> f) // <- Bind | |
{ | |
return f (_val); | |
} | |
#endregion | |
} | |
class Nothing<T> : Maybe<T> | |
{ | |
public Nothing() {} // <- Unit | |
#region Maybe implementation | |
override public T Value () | |
{ | |
return default(T); | |
} | |
override public bool HasValue() { return false; } | |
override public Maybe<T> Bind (Func<T, Maybe<T>> f) | |
{ | |
return new Nothing<T>(); // don't care | |
} | |
#endregion | |
} | |
class MainClass | |
{ | |
public static void printVal<T>(Maybe<T> m) | |
{ | |
if (m.HasValue()) Console.WriteLine (m.Value()); | |
else Console.WriteLine ("no value present"); | |
} | |
public static Maybe<int> Example1(int val) | |
{ | |
return Maybe<int>.Return(val) | |
.Bind (x => Maybe<int>.Return(x + 4)) | |
.Bind (x => Maybe<int>.Return(x * 100)) | |
.Bind (x => x >= 2400 ? (Maybe<int>)Maybe<int>.Return(x) : (Maybe<int>)new Nothing<int>()); | |
} | |
public static Maybe<int> Example2(int val) | |
{ | |
return Maybe<int>.Return(val) | |
.Bind (x => x == 0 ? (Maybe<int>)new Nothing<int> () : (Maybe<int>)Maybe<int>.Return (x)) | |
.Bind (x => Maybe<int>.Return (50 / x)); | |
} | |
public static void Main (string[] args) | |
{ | |
printVal<int> (Example1 (20)); | |
printVal<int> (Example1 (10)); | |
printVal<int> (Example2 (0)); | |
printVal<int> (Example2 (10)); | |
/* | |
2400 | |
no value present | |
no value present | |
5 | |
*/ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment