From f62435e2868f5db15cc2f31300630c8ec873dd58 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sat, 12 Jul 2014 17:16:36 +0200 Subject: monads: Fix 'mapm' so that effects happen from left to right. * guix/monads.scm (mapm): Don't reverse LST, so that items are processed from left to right. Bind the result of 'foldm' and reverse it. * tests/monads.scm ("sequence"): Change 'frob' so it performs its side effect within an 'mlet' body. Adjust call accordingly. --- guix/monads.scm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'guix/monads.scm') diff --git a/guix/monads.scm b/guix/monads.scm index ec2b7f8b3b..c2c6f1a03d 100644 --- a/guix/monads.scm +++ b/guix/monads.scm @@ -209,13 +209,15 @@ (define (foldm monad mproc init lst) (define (mapm monad mproc lst) "Map MPROC over LST, a list of monadic values in MONAD, and return a monadic -list." - (foldm monad - (lambda (item result) - (mlet monad ((item (mproc item))) - (return (cons item result)))) - '() - (reverse lst))) +list. LST items are bound from left to right, so effects in MONAD are known +to happen in that order." + (mlet monad ((result (foldm monad + (lambda (item result) + (mlet monad ((item (mproc item))) + (return (cons item result)))) + '() + lst))) + (return (reverse result)))) (define-inlinable (sequence monad lst) "Turn the list of monadic values LST into a monadic list of values, by -- cgit v1.2.3