10

状態モナド「インターフェース」

class MonadState s m where
    get :: m s
    put :: s -> m ()

(+ return と bind) により、コンストラクターを使用せずに State モナドを使用して可能な計算を構築できますState。たとえば、次のState $ \s -> (s+1, s-1)ように記述できます。

 do s <- get
    put (s-1)
    return (s+1)

同様に、とを使用Readerしてその計算を作成できるため、コンストラクターを使用する必要はありません。正確には: .askreturn(>>=)Reader f == ask >>= return . f

継続についても同じことが当てはまりますか - Cont r ausingのすべてのインスタンスcallCC( の唯一の関数MonadCont) を記述し、 return と bind を作成して、 のようなものを入力しないことは可能Cont (\c -> ...)ですか?

4

1 に答える 1

7

私はそうは思わない。タイプを見ると:

Cont :: ((a -> r) -> r) -> Cont r a
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a

しか持っていcallCCない場合、どこでもタイプとして使用するrことはできません-それはあらゆる種類のものである可能性があります。したがって、それを型として使用するものをどのように翻訳できるかわかりません。たとえば、次のようになります。

Cont (const 42) :: Cont Int a

rしか持っていない場合、制約する方法がありませんcallCC

とにかく、それは私の予感です。それほど厳密ではありませんが、説得力があるようです。

于 2010-04-17T22:23:20.603 に答える