doc: Document '%state-monad' and update '%store-monad' description.
* doc/guix.texi (The Store Monad): Document '%state-monad' and related procedures. Describe '%store-monad' as an alias for '%state-monad'. * guix/monads.scm: Update commentary.
This commit is contained in:
parent
4e190c2803
commit
561fb6c31f
@ -2148,7 +2148,7 @@ provides a framework for working with @dfn{monads}, and a particularly
|
|||||||
useful monad for our uses, the @dfn{store monad}. Monads are a
|
useful monad for our uses, the @dfn{store monad}. Monads are a
|
||||||
construct that allows two things: associating ``context'' with values
|
construct that allows two things: associating ``context'' with values
|
||||||
(in our case, the context is the store), and building sequences of
|
(in our case, the context is the store), and building sequences of
|
||||||
computations (here computations includes accesses to the store.) Values
|
computations (here computations include accesses to the store.) Values
|
||||||
in a monad---values that carry this additional context---are called
|
in a monad---values that carry this additional context---are called
|
||||||
@dfn{monadic values}; procedures that return such values are called
|
@dfn{monadic values}; procedures that return such values are called
|
||||||
@dfn{monadic procedures}.
|
@dfn{monadic procedures}.
|
||||||
@ -2257,14 +2257,68 @@ monadic expressions are ignored. In that sense, it is analogous to
|
|||||||
@code{begin}, but applied to monadic expressions.
|
@code{begin}, but applied to monadic expressions.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@cindex state monad
|
||||||
|
The @code{(guix monads)} module provides the @dfn{state monad}, which
|
||||||
|
allows an additional value---the state---to be @emph{threaded} through
|
||||||
|
monadic procedure calls.
|
||||||
|
|
||||||
|
@defvr {Scheme Variable} %state-monad
|
||||||
|
The state monad. Procedures in the state monad can access and change
|
||||||
|
the state that is threaded.
|
||||||
|
|
||||||
|
Consider the example below. The @code{square} procedure returns a value
|
||||||
|
in the state monad. It returns the square of its argument, but also
|
||||||
|
increments the current state value:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(define (square x)
|
||||||
|
(mlet %state-monad ((count (current-state)))
|
||||||
|
(mbegin %state-monad
|
||||||
|
(set-current-state (+ 1 count))
|
||||||
|
(return (* x x)))))
|
||||||
|
|
||||||
|
(run-with-state (sequence %state-monad (map square (iota 3))) 0)
|
||||||
|
@result{} (0 1 4)
|
||||||
|
@result{} 3
|
||||||
|
@end example
|
||||||
|
|
||||||
|
When ``run'' through @var{%state-monad}, we obtain that additional state
|
||||||
|
value, which is the number of @code{square} calls.
|
||||||
|
@end defvr
|
||||||
|
|
||||||
|
@deffn {Monadic Procedure} current-state
|
||||||
|
Return the current state as a monadic value.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Monadic Procedure} set-current-state @var{value}
|
||||||
|
Set the current state to @var{value} and return the previous state as a
|
||||||
|
monadic value.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Monadic Procedure} state-push @var{value}
|
||||||
|
Push @var{value} to the current state, which is assumed to be a list,
|
||||||
|
and return the previous state as a monadic value.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Monadic Procedure} state-pop
|
||||||
|
Pop a value from the current state and return it as a monadic value.
|
||||||
|
The state is assumed to be a list.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} run-with-state @var{mval} [@var{state}]
|
||||||
|
Run monadic value @var{mval} starting with @var{state} as the initial
|
||||||
|
state. Return two values: the resulting value, and the resulting state.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
The main interface to the store monad, provided by the @code{(guix
|
The main interface to the store monad, provided by the @code{(guix
|
||||||
store)} module, is as follows.
|
store)} module, is as follows.
|
||||||
|
|
||||||
@defvr {Scheme Variable} %store-monad
|
@defvr {Scheme Variable} %store-monad
|
||||||
The store monad. Values in the store monad encapsulate accesses to the
|
The store monad---an alias for @var{%state-monad}.
|
||||||
store. When its effect is needed, a value of the store monad must be
|
|
||||||
``evaluated'' by passing it to the @code{run-with-store} procedure (see
|
Values in the store monad encapsulate accesses to the store. When its
|
||||||
below.)
|
effect is needed, a value of the store monad must be ``evaluated'' by
|
||||||
|
passing it to the @code{run-with-store} procedure (see below.)
|
||||||
@end defvr
|
@end defvr
|
||||||
|
|
||||||
@deffn {Scheme Procedure} run-with-store @var{store} @var{mval} [#:guile-for-build] [#:system (%current-system)]
|
@deffn {Scheme Procedure} run-with-store @var{store} @var{mval} [#:guile-for-build] [#:system (%current-system)]
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
;;;
|
;;;
|
||||||
;;; This module implements the general mechanism of monads, and provides in
|
;;; This module implements the general mechanism of monads, and provides in
|
||||||
;;; particular an instance of the "store" monad. The API was inspired by that
|
;;; particular an instance of the "state" monad. The API was inspired by that
|
||||||
;;; of Racket's "better-monads" module (see
|
;;; of Racket's "better-monads" module (see
|
||||||
;;; <http://planet.racket-lang.org/package-source/toups/functional.plt/1/1/planet-docs/better-monads-guide/index.html>).
|
;;; <http://planet.racket-lang.org/package-source/toups/functional.plt/1/1/planet-docs/better-monads-guide/index.html>).
|
||||||
;;; The implementation and use case were influenced by Oleg Kysielov's
|
;;; The implementation and use case were influenced by Oleg Kysielov's
|
||||||
|
Loading…
Reference in New Issue
Block a user