Skip to content

Instantly share code, notes, and snippets.

@kikairoya
Created December 13, 2013 14:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kikairoya/7945048 to your computer and use it in GitHub Desktop.
Save kikairoya/7945048 to your computer and use it in GitHub Desktop.
(defun fmap (f m)
(funcall (get (si:*structure-definition-name (si:*structure-definition m)) 'fmap) f m))
(defun >>= (m f)
(funcall (get (si:*structure-definition-name (si:*structure-definition m)) '>>=) m f))
(defun >> (m a)
(funcall (get (si:*structure-definition-name (si:*structure-definition m)) '>>) m a))
(defstruct maybe
has-value
value)
(defun just (x)
(make-maybe :has-value t :value x))
(defun nothing ()
(make-maybe :has-value nil))
(setf
(get 'maybe 'fmap) (lambda (f m)
(if (maybe-has-value m)
(just (funcall f (maybe-value m)))
(nothing)))
(get 'maybe '>>=) (lambda (m f)
(if (maybe-has-value m)
(just (funcall f (maybe-value m)))
(nothing)))
(get 'maybe '>>) (lambda (m a)
(if (maybe-has-value m)
(just (funcall a))
(nothing)))
(get 'maybe 'return) #'just
(get 'maybe 'fail) (lambda (s) (nothing)))
(defun parse-integer-maybe (s)
(or (ignore-errors
(multiple-value-bind (n b)
(parse-integer s)
(and b (= (length s) b) (just n))))
(nothing)))
(>>=
(parse-integer-maybe "12")
(lambda (i) (1+ i)))
(>>=
(parse-integer-maybe "aa")
(lambda (i) (1+ i)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment