Created
April 6, 2019 14:52
-
-
Save shajra/7b8fe5783c7500b2b4cafbec8411b815 to your computer and use it in GitHub Desktop.
A OO-style encoding of sum types in Nix
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
let | |
build = match: rec { | |
inherit match; | |
map = f: match nothing (a: just(f a)); | |
bind = f: match nothing (a: f a); | |
isJust = f: match false (a: true); | |
isNothing = f: match true (a: false); | |
show = match "Nothing" (a: "Just ${toString a}"); | |
toList = match [] (a: [a]); | |
}; | |
just = a: build (ifNothing: ifJust: ifJust a); | |
nothing = build (ifNothing: ifJust: ifNothing); | |
in { | |
inherit just nothing; | |
usage = { | |
mappingNothing = | |
(nothing.map (a: a + 1)).toList; | |
mappingJust = | |
((just 1).map (a: a + 1)).toList; | |
bindingNothing = | |
(nothing.bind (a: if a > 0 then just (a + 1) else nothing)).toList; | |
bindingJust = | |
((just (1)).bind (a: if a > 0 then just (a + 1) else nothing)).toList; | |
bindingJust' = | |
((just (-1)).bind (a: if a > 0 then just (a + 1) else nothing)).toList; | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment