在学习Clojure的同时,我花了很多时间试图理解monad - 它们是什么以及我们如何使用它们......并没有太多的成功.然而,我发现了一个出色的'Monads for Dummies'视频系列 - http://vimeo.com/20717301 - 作者:Brian Marik为Clojure
到目前为止,我对monad的理解是它有点像一个宏,它允许一组语句以易于阅读的形式编写 - 但monad更加正式化.我的观察仅限于两个例子:
1.身份Monad(或'let'monad)取自http://onclojure.com/2009/03/05/a-monad-tutorial-for-clojure-programmers-part-1/
我们希望写的表格是:
(let [a 1
b (inc a)]
(* a b))
Run Code Online (Sandbox Code Playgroud)
和相应的monad是
(domonad identity-m
[a 1
b (inc a)]
(* a b))
Run Code Online (Sandbox Code Playgroud)
2.序列Monad(或'for'monad)取自http://onclojure.com/2009/03/06/a-monad-tutorial-for-clojure-programmers-part-2/
我们希望写的形式是:
(for [a (range 5)
b (range a)]
(* a b))
Run Code Online (Sandbox Code Playgroud)
和相应的monad是
(domonad sequence-m
[a (range 5)
b (range a)]
(* a b))
Run Code Online (Sandbox Code Playgroud)
Clojure中的Monad定义
查看源代码,使用clojure monads库 - https://github.com/clojure/algo.monads:
user=>(use 'clojure.algo.monads)
nil
Run Code Online (Sandbox Code Playgroud)
indent monad:
user=> (source identity-m)
(defmonad identity-m
[m-result …
Run Code Online (Sandbox Code Playgroud)