 
 (defn do-bind [lst]
   (bind lst
-       (fn [elem]
-         (bind (half-double elem)
-              (fn [halfdouble]
-                (inc-int halfdouble))))))
-
-(do-bind [8 10])                                               ;;'(9 14 21 26 10 15 25 30)
+        (fn [elem]
+          (bind (half-double elem)
+                (fn [halfdouble]
+                  (inc-int halfdouble))))))
+
+(do-bind [8 10])                                            ;;'(9 14 21 26 10 15 25 30)
 
 ;;and without monad
 

;;just read the algo.monads source code
;;algo.monads提供了自定义monad的能力 只要实现m-result m-bind m-zero m-plus四个函数就可以利用domonad来使用monad的威力
(def list-monad {:m-result (fn [v] [v])
                 :m-bind (fn [mv f]
                         (if (seq mv)
                           (apply concat (map f mv)) []))})

;;just list comprehension again
;;由于clojure缺乏type inference的能力(强类型动态语言硬伤)所以在monad的时候必须显式指名monad的类型 而无法通过类型系统自动判断使用哪一个monad


(def list-m {
             :return (fn [v] (list v))
             :bind   (fn [mv f]
                       (mapcat f mv))
             })

(let [bind (:bind list-m)
