From: pimjager <pim@pimjager.nl> Date: Thu, 23 Jun 2016 10:38:59 +0000 (+0200) Subject: Maybe fmap no longer edits input X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=1fde17abca63694279707e6ea3e8b46b6845b67c;p=cc1516.git Maybe fmap no longer edits input --- diff --git a/examples/demo/maybe.spl b/examples/demo/maybe.spl index a4b9416..b676aea 100644 --- a/examples/demo/maybe.spl +++ b/examples/demo/maybe.spl @@ -6,26 +6,26 @@ pure(a) :: a -> (Int, a) { return (1, a); } -//note, ma is edited by reference! fmap(f, ma) :: (a -> b) -> (Int, a) -> (Int, b) { + var t = ma.snd; //copy to avoid editing ma by reference if (ma.fst == 0) { return ma; } else { - ma.snd = f(ma.snd); - return ma; + t = f(ma.snd); + return (ma.fst, t); } } + bind(ma, f) :: (Int, a) -> (a -> (Int, b)) -> (Int, b) { if (ma.fst == 0) { return ma; } else { - return f(ma.snd); + return f(ma.snd); } } main() { var j = pure(True); - var f = \b->!b; var n = (0, False); //ugly that we need the additional parameter var jf = fmap(\b->!b, j); @@ -33,12 +33,12 @@ main() { var fma = \b -> pure(!b); - var bjf = bind(j, fma); //note is true because ma is passed by reference + var bjf = bind(j, fma); bar bnf = bind(n, fma); print("fmap Just false: ", jf.fst, jf.snd, "\n"); print("fmap Nothing: ", nf.fst, "\n"); - print("bind Just True: ", bjf.fst, bjf.snd, "\n"); + print("bind Just False: ", bjf.fst, bjf.snd, "\n"); print("bind Nothing: ", bnf.fst, "\n"); } \ No newline at end of file