10

私はClojure プログラマ向けのモナドの優れた入門書を読んでいます。この記事では、Identity モナドが Clojure のletと機能的に同等であり、Sequence/List モナドがforと同等であることを示しています。

この記事がモナド変換子に到達すると、Maybe モナドと Sequence モナドを組み合わせた例が示されます。forの代わりに Sequence モナドを使う理由の 1 つは、それを変換できるからです。しかし、Identity モナドを変換することは私には意味がありません。それは、変換するモナドが何であれ、構築することと常に同等ではないでしょうか? たとえば、Maybe を Identity で変換した場合、Maybe が返されるだけでなく、直接宣言する方が簡単でしたか?

Let よりも Identity モナドを選択するために Clojureに実用的な用途があるかどうかを誰かが明確にすることができますか(おそらく、トランスフォーマーの意味を完全に考えているわけではありませんか?)、それとも理論的な完全性のためだけにあるのでしょうか?

4

2 に答える 2

8

実際、恒等モナドはモナド変換子のベースとして非常に便利です。たとえば、maybe モナド トランスフォーマー (maybe-t) は、nil 以外の値を許可しません。

1:2 => (use 'clojure.contrib.monads)
nil
1:3 => (domonad maybe-m [a 1 b 2] (+ a b))
3
1:4 => (domonad maybe-m [a 1 b nil] (+ a b))
nil
;; Domain uses the :fail keyword as the nil value:
1:6 => (domonad (maybe-t identity-m :fail) [a 1 b :fail] (+ a b))
:fail

基本モナドとして Maybe-m を使用すると、:fail だけでなく、:fail と nil の両方がショートカットされることに注意してください。

于 2010-08-17T10:44:49.717 に答える
7

with-monad正当な理由の 1 つは、特定のモナドに結び付けられていないモナド関数を記述して、それらをブロックで実行できることです。identity-mを書く場合、特別なモナドブードゥー教を含まないオプションを提供します(with-monad identity-m ...)

(明らかに、モナド関数が動作するモナドのいくつかのプロパティを本質的に利用している場合、これは機能しません。たとえば、状態のゲッターとセッターの可用性などです。ただし、すべてのモナド関数がこのようになるわけではありません。)

于 2010-08-16T04:32:12.850 に答える