diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-03-18 18:43:51 +0100 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-03-18 18:43:51 +0100 |
commit | e650a80856edc1d1df1f163c3f84082455717fa0 (patch) | |
tree | 4848ad975d95f5765980980d0e10ed0752e553f9 /control/monad | |
parent | Assorted comments and cleanup. (diff) | |
download | scheme-monad-e650a80856edc1d1df1f163c3f84082455717fa0.tar.gz scheme-monad-e650a80856edc1d1df1f163c3f84082455717fa0.tar.xz |
Compleately redid file structure.
Diffstat (limited to 'control/monad')
-rw-r--r-- | control/monad/procedures.scm | 33 | ||||
-rw-r--r-- | control/monad/state.scm | 83 |
2 files changed, 0 insertions, 116 deletions
diff --git a/control/monad/procedures.scm b/control/monad/procedures.scm deleted file mode 100644 index 707dc0b..0000000 --- a/control/monad/procedures.scm +++ /dev/null @@ -1,33 +0,0 @@ -(define-module (control monad procedures) - #:use-module (oop goops) - #:use-module (srfi srfi-1) ; concatenate! - #:export (>> >>= return)) - -(define-generic return) -(define-method (return (a <top>)) identity) -(define-method (return (a <pair>)) list) - -(define-generic >>=) - -(define-method (>>= (a <top>) (proc <procedure>)) - (proc a)) - -(define-method (>>= (this <null>) proc) '()) -(define-method (>>= (this <pair>) - (proc <procedure>)) - (concatenate! (map proc this))) - -(define-generic >>) - -(define-method (>> (a <top>) (b <top>)) - (>>= a (lambda args b))) - -(define-method (>> (a <null>) (b <null>)) '()) -(define-method (>> (a <pair>) (b <null>)) '()) -(define-method (>> (a <null>) (b <pair>)) '()) -(define-method (>> (a <pair>) (b <pair>)) - (concatenate! (map (const b) a))) - -;; bind :: Monad m => m a -> (a -> m b) -> m b -;; return :: Monad m => a -> m a -;; map :: Functor f => (a -> b) -> f a -> f b diff --git a/control/monad/state.scm b/control/monad/state.scm deleted file mode 100644 index b5fefe3..0000000 --- a/control/monad/state.scm +++ /dev/null @@ -1,83 +0,0 @@ -(define-module (control monad state) - #:use-module (oop goops) - #:use-module (ice-9 match) - #:use-module (control monad) - #:export (return-state run-state get put modify) - #:re-export (>>= >> fmap return)) - - -;; Alternative implementation of get. -;; See https://hackage.haskell.org/package/mtl-2.2.1/docs/src/Control.Monad.State.Class.html#get - -;;; newtype State = st-list -> st-list - -;;; state procedure <=> st-list -> st-list -;;; state list <=> (list ret st) - -;;; Wrapper around a procedure with signature: -;;; (st-list -> st-list). Wrapped to allow goops -;;; multiple dispatch to do its thing. -(define-class <state> () - (proc #:init-keyword #:proc - #:getter proc)) - -;; (st-list -> st-list) -> State -(define (make-state proc) - "Creates a state object from a State procedure" - (make <state> #:proc proc)) - -;;; Define a procedure which is in the state monad. This means that it takes a -;;; state list as a curried argument, and it's return is wrappen in a <state> -;;; object. -;;; It's fully possible to create stateful objects without these macros, but it's -;;; ill adviced since that would just be boilerplate. - -(define-syntax-rule (define-stateful ((proc args ...) st) body ...) - (define (proc args ...) - (make-state - (lambda (st) body ...)))) - -(define-syntax-rule (define-stateful-method ((proc args ...) st) body ...) - (define-method (proc args ...) - (make-state - (lambda (st) body ...)))) - -(define-stateful-method ((>>= (st <state>) (f <procedure>)) st-list) - (let ((new-st-list ((proc st) st-list))) - (match new-st-list - ((v _) - ((proc (f v)) new-st-list))))) - -;; (define-stateful-method ((>> (a <state>) (b <state>)) st-list-a) -;; (let ((st-list-b ((proc a) st-list-a))) -;; ((proc b) st-list-b))) - -(define-stateful ((return-state v) st-list) - "Sets the return value to v" - (cons v (cdr st-list))) - -(define-method (return (a <state>)) return-state) - -(define-stateful ((get) st-list) - "Sets the return value of state to st." - (match st-list - ((_ st) - (list st st)))) - -(define-stateful ((put v) st-list) - "Sets st to v." - (list '() v)) - -(define-stateful ((modify proc) st-list) - (match st-list - ((r s) - (list '() (proc s))))) - -;; (define-stateful-method ((fmap (f <procedure>) (s <state>)) st-list) -;; (match ((proc s) st-list) -;; ((r st) -;; (list (f r) st)))) - -(define-method (run-state (st <state>) init) - "Exec state with init as starting state value and st." - ((proc st) (list init init))) |