2013-05-28 37 views
1

这里是我尝试在elisp中实现Maybe monad。它在第一个零上打破它的功能组合。但是value总是13。我的错误在哪里?也许monis在elisp

(defun .compose-maybe (&rest funcs) 
    "Monad Maybe function composition with nil as Nothing." 
    (lambda (arg) 
    (if funcs 
     (let ((value (funcall (apply #'.compose-maybe (cdr funcs)) arg))) 
      (message "%s" value) 
      (when value (funcall (car funcs) value)))) 
     arg)) 

(funcall (.compose-maybe (lambda (x) (* x 5)) (lambda (x) (+ 100 x))) 13) 

回答

2

arg瀑布(if funcs ...)的bouds之外,从而在.compose-maybe内拉姆达总是返回arg而不是只有当funcsnil

(defun .compose-maybe (&rest funcs) 
    "Monad Maybe function composition with nil as Nothing." 
    (lambda (arg) 
    (if funcs 
     (let ((value (funcall (apply #'.compose-maybe (cdr funcs)) arg))) 
      (message "%s" value) 
      (when value (funcall (car funcs) value))) 
     arg)))