Skip to content

Instantly share code, notes, and snippets.

@matthewphilyaw
Created December 27, 2015 16:37
Show Gist options
  • Save matthewphilyaw/b20335bfeed298502293 to your computer and use it in GitHub Desktop.
Save matthewphilyaw/b20335bfeed298502293 to your computer and use it in GitHub Desktop.
Maybe Monad take 2
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