1

私はClojureでモナドを実験していて、次のコードを思いつきました。ここで、モナドの値と状態のペアは、可変のClojuredeftypeオブジェクトで表されます。

オブジェクトは変更可能であるため、常に新しい結果オブジェクトを作成しなくても、モナディックコードを記述できるという利点があるように思われます。

しかし、私はモナドにかなり慣れていないので、知りたいです:

  • この構成は意味がありますか?
  • それは実際にモナドとして正しく機能しますか?

以下のコード:

(defprotocol PStateStore 
  (set-store-state [ss v])
  (get-store-state [ss])
  (set-store-value [ss v])
  (get-store-value [ss]))

(deftype StateStore [^{:unsynchronized-mutable true} value 
                     ^{:unsynchronized-mutable true} state]
  PStateStore 
      (get-store-state [ss] (.state ss))
      (get-store-value [ss] (.value ss))
      (set-store-state [ss v] (set! state v))
      (set-store-value [ss v] (set! value v))

   Object
     (toString [ss] (str "value=" (.value ss) ", state=" (.state ss))))

(defn state-store [v s] (StateStore. v s))

(defmonad MStoredState
  [m-result (fn [v] 
              (fn [^StateStore ss] 
                  (do
                    (set-store-value ss v)
                    ss)))
   m-bind (fn [a f]
            (fn [^StateStore ss]
              (do
                (a ss)
                ((f (get-store-value ss)) ss))))])

; Usage examples

(def mb
  (domonad MStoredState
    [a (m-result 1)
     b (m-result 5)]
    (+ a b)))

(def ssa (state-store 100 101))

(mb ssa)

; => #<StateStore value=6, state=101>
4

1 に答える 1

3

いいえ、可変状態を使用しているため、モナドとして正しく機能しません。

mと呼ぶモナド値 (状態を保持する値) があると想像してくださいStateStore。これができるようになりたい:

(let
   [a (incr-state m)
    b (decr-state m)]
  (if some-condition a b))

私が期待しているのは、この計算は、m状態が に従ってsome-conditionインクリメントまたはデクリメントされたモナドを返すことです。ミュータブルな状態を使用すると、このコードの評価中にインクリメントとデクリメントの両方が行われます。

モナドの良い点の 1 つは、モナドが効果を表している一方で、通常の純粋で可変でない値として動作することです。それらを渡したり、複製したりできます(letモナド値の定義を展開し、その名前をすべての使用場所での定義に置き換えることができます)。注意しなければならない唯一の場所は、実際にを使用して効果を連鎖m-bindさせる場所です。それ以外の場合、通常の命令型プログラミングのように、コードの関係のない部分に効果の暗黙的な連鎖はありません。これは、副作用を制限したい状況で、モナドについての推論をより簡単かつ快適にするものです。

編集

モナドの法則について聞いたことがあるかもしれません。これは、モナドの実装が尊重すべき方程式です。ただし、ここでの問題は、法律を破ることではありません。法律はこれについて語っていないからです。実際、モナド則は通常 Haskell の純粋言語で記述されているため、副作用は考慮されていません。

必要に応じて、それを第 4 の暗黙のモナド法則と見なすこともできます: 良いモナドは参照透過性を尊重する必要があります

于 2010-10-23T17:53:46.143 に答える