Saya tahu ini telah dijawab, dan saya sudah memasangnya sendiri, tetapi saya pikir saya akan menambahkan yang berikut ini karena saya telah memainkannya menggunakan monad lagi, dan ini sepertinya pertanyaan yang bagus untuk ditentang.
Membaca artikel tentang threading monads ini, saya bisa datang lakukan yang berikut ini dengan memperluas makro m->
yang ditentukan dalam artikel untuk membuat mungkin monad berulir untuk penggunaan yang lebih sederhana. TBH, ini tidak lebih sederhana daripada hanya menggunakan some->
tetapi ini untuk keingintahuan pribadi.
Oke, sebagai permulaan, ada satu kode pelat ketel yang harus didefinisikan, berikut (kalau-kalau artikelnya hilang) adalah definisi monad berulir Giles:
(defn bind-monadic-expr-into-form [insert form]
(list 'm-bind insert
(if (seq? form)
`(fn [bound#] (~(first form) bound# ~@(rest form)))
`(fn [bound#] (~form bound#)))))
(defmacro m->
([m x]
`(with-monad ~m ~x))
([m x form]
`(with-monad ~m
~(bind-monadic-expr-into-form x form)))
([m x form & more]
`(m-> ~m (m-> ~m ~x ~form) ~@more)))
Sekarang dengan ini, Anda dapat mendefinisikan makro berulir sebagai
(defmacro maybe->
([x] `(m-> ~maybe-m ~x))
([x form] `(m-> ~maybe-m ~x ~form))
([x form & more] `(maybe-> (maybe-> ~x ~form) ~@more)))
Dan gunakan seperti:
(maybe-> 1 inc)
=> 2
(maybe-> [1 2] (#(map inc %)))
=> (2 3)
(defn f1 [x] (+ 1 x))
(maybe-> 1 f1 f1)
=> 3
(maybe-> 1 f1 ((constantly nil)) f1)
=> nil
(maybe-> {:a 1 :b 2} :c inc)
=> nil
Sama sekali tidak ada keuntungan menggunakan ini dibandingkan some->
dalam konteks ini, tetapi monad m->
memang menambahkan beberapa kemampuan menarik untuk dapat membuat makro fail->
seperti pada artikel yang saya tautkan, yang menawarkan lebih dari sekadar "nihil" sebagai imbalannya, memberi Anda kemampuan untuk membedakan alasan kegagalan.
person
Mark Fisher
schedule
18.05.2015