12

トランスフォーマー パッケージを調べているときに、 IdentityTという名前のモナド トランスフォーマーを見つけました。

Identity モナドがどのように使われるか (例えばStateは単に のエイリアスであるStateT Identity) とモナド変換子が一般的にどのように機能するかは理解していますが、それが とどのように関係しているかはわかりませんIdentityT

MTL には含まれていないので、完全を期すために追加されたもので、実際には使用されていないと思います。あれは正しいですか?

4

2 に答える 2

6

リンクされたドキュメントは言う

これは、モナド変換子によってパラメーター化された関数に役立ちます。

私はこれが実際に当てはまる状況を認識していませんが。foo :: (MonadTrans t, Monad m) => t m a -> b理論的には、いくつかの便利な のような関数がある場合、を使用bして本質的に「ダムダウン」できるようにしたい場合があります。m a -> bt = IdentityT

しかし、それIdentityTMonadTransIdentityですMonadIdentityこれは、「パススルー」モナドと同様に、「パススルー」変換子です。ソースを確認してください。それはかなり単純です。IdentityT SomeMonad aと同じようSomeMonad aに動作する必要があります。唯一の違いは、余分な newtype が存在することです (もちろん、コンパイル時に削除されます)。

于 2012-02-03T08:21:02.910 に答える
2

ここで提案された使用法があります (おそらく IdentityT の起源: http://www.haskell.org/pipermail/libraries/2007-June/007563.html

主な用途は、ソース コード レベルで柔軟性を持たせることです。たとえば、誰かがソースを xmonad に編集し、コードをあまり編集せずに独自の UserT を置き換えることができます。

それがライブラリでどのように機能するかを確認しようとしました-スタックの真ん中にモナドを挿入するためのプレースホルダーを提供するために使用できますが、それがうまくいくかどうかはわかりません. これが私の不自然な例です:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

import Control.Monad.State
import Control.Monad.List
import Control.Monad.Reader

type X m a = StateT Int (m IO) a

something :: (Monad (m IO), MonadIO (m IO)) => (m IO) Int -> X m Int 
something a = do
        x <- lift a
        put (x + 1)

        liftIO $ print x
        return x



listSomething = something $ ListT (mapM return [1,2,3,4])
plainSomething = return 5 :: IdentityT IO Int

main = do 
    x <- runListT (execStateT listSomething 3)
    print x 

    y <- runIdentityT (execStateT plainSomething 3)
    print y

runIdentity $ mapM (return . (+1)) [1..100]
于 2012-02-03T03:24:50.770 に答える