(defn bind [val f]
  (if-let [v (:value val)] (f v) val))

(defn unit [val] {:value val})

(defn opt_add_3 [n] (unit (+ 3 n))) 
(defn opt_str [n] (unit (str n)))   

(bind (unit 4) opt_add_3)                  
(bind (unit nil) opt_add_3)                
(bind (bind (unit 8) opt_add_3) opt_str)   
(bind (bind (unit nil) opt_add_3) opt_str)