Skip to content

Instantly share code, notes, and snippets.

@Ericson2314
Last active May 26, 2017 15:49
Show Gist options
  • Save Ericson2314/ab120ccce04ac41b2ec2bec11fda3879 to your computer and use it in GitHub Desktop.
Save Ericson2314/ab120ccce04ac41b2ec2bec11fda3879 to your computer and use it in GitHub Desktop.
fix-extends monoid
{
# Like `extends` from the "fix-extends" idiom, but with the type:
#
# ({..} -> {..} -> {..})
# -> ({..} -> {..} -> {..})
# -> ({..} -> {..} -> {..})
#
# instead of
#
# ({..} -> {..} -> {..})
# -> ({..} -> {..})
# -> ({..} -> {..} -> {..})
#
# Since both parameters have the same type, this could be a monoid, and in
# fact it is! Given the following identity value:
#
# id = _: _: {};
#
# extendsMonoid f id =
# self: super0: let super1 = id self super0; in super1 // f self (super0 // super1);
# self: super0: let super1 = {}; in super1 // f self (super0 // super1);
# self: super0: in {} // f self (super0 // {});
# self: super0: in f self super0;
# self: super0: in f self super0;
# f;
#
#
# extendsMonoid id f =
# self: super0: let super1 = f self super0; in super1 // id self (super0 // super1);
# self: super0: let super1 = f self super0; in super1 // {};
# self: super0: let super1 = f self super0; in super1;
# self: super0: f self super0;
# f;
#
# extendsMonoid f0 (extendsMonoid f1 f2) =
#
# self: super0: let super1 = (extendsMonoid f1 f2) self super0;
# in super1 // f0 self (super0 // super1);
#
# self: super0: let super1 = (self': super': let super2 = f2 self' super';
# in super2 // f1 self' (super' // super2))
# self super0;
# in super1 // f0 self (super0 // super1);
#
# self: super0: let super1 = let super2 = f2 self super0;
# in super2 // f1 self (super0 // super2)
# in super1 // f0 self (super0 // super1);
#
# self: super0: let super2 = f2 self super0;
# super1 = super2 // f1 self (super0 // super2)
# in super1 // f0 self (super0 // super1);
#
# self: super0: let super2 = f2 self super0;
# in let super1 = super2 // f1 self (super0 // super2)
# in super1 // f0 self (super0 // super1);
#
# self: super0: let super2 = f2 self super0;
# in let super1 = f1 self (super0 // super2)
# in (super2 // super1) // f0 self (super0 // (super2 // super1));
#
# self: super0: let super2 = f2 self super0;
# in super2 // let super1 = f1 self (super0 // super2)
# in super1 // f0 self ((super0 // super2) // super1);
#
# self: super0: let super2 = f2 self super0;
# in super2 // (self': super': let super1 = f1 self' super'
# in super1 // f0 self' (super' // super1))
# self' (super0 // super2);
#
# self: super0: let super2 = f2 self super0;
# in super2 // (extendsMonoid f0 f1) self' (super0 // super2);
#
# extendsMonoid (extendsMonoid f0 f1) f2;
extendsMonoid = f0: f1: self: super0: let super1 = f1 self super0; in super1 // f0 self (super0 // super1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment