Monad.Readerと(->)モナドの違いは何ですか?

翔や

Monad.Readerは、実際には関数のカプセル化であることがわかりました。

newtype Reader r a = Reader { runReader :: r -> a }

これはモナドのインスタンスになります、

instance Monad (Reader r) where
    return a = Reader $ \_ -> a
    m >>= k  = Reader $ \r -> runReader (k (runReader m r)) r

対照的に、私は(->)もモナドであることを知っていました。

instance Monad ((->) r) where
    return = const
    f >>= k = \ r -> k (f r) r

定義から、それらが実際にまったく同じように動作することがわかります。

それで、それらはすべての使用法で交換可能ですか?そして、これら2つのモナドを異なることの実際の重要性は何ですか?

ゼータ

TL; DR

それらは同じです。

いくつかの歴史のレッスン

StateWriterおよびReaderマークP.ジョーンズのオーバーロードと高階ポリモーフィズムを使用した関数型プログラミングに触発されました。Readerは次のように定義しました。

Readerモナドは、(タイプで表されるいくつかの囲み環境で保持された値にアクセスするための演算できるようにするために使用されるr以下の定義では)。

> instance Monad (r->) where
>     result x = \r -> x
>     x `bind` f = \r -> f (x r) r

通過するコメントとして、これらの2つの関数は、コンビネータ論理の標準KおよびSコンビネータにすぎないことに注意してください

後で、彼は(ほぼ)今日のことを定義しますMonadReader

Reader monads :いくつかの固定環境を参照する計算を記述するためのモナドのクラス:

> class Monad m => ReaderMonad m r where
>     env :: r -> m a -> m a
>     getenv :: m r

> instance ReaderMonad (r->) r where
>     env e c = \_ -> c e
>     getenv = id

getenvは単にask、であり、envですlocal . constしたがって、この定義には、のすべての重要な部分がすでに含まれていReaderます。最終的に、ジョーンズはモナド変換子を定義しますReaderTBComp後方構成です)。

まず、2つの異なる形式の構成を定義すると便利です。前方(FComp)および後方(BComp):

> data FComp m n a = FC (n (m a))
> data BComp m n a = BC (m (n a))

[Functor、Monad、OutOfインスタンスを省略]

> type ReaderT r = BComp (r ->)

以来StateTWriterTなどがその非トランスバリアントを持っていた、持っている唯一の論理的だったReader r本当に同じです、(->) r

どちらの方法が、最近はReaderWriterおよびStateそのトランスバリアントで定義されている、とあなたは、それぞれの使用Monad*型クラスを(MonadReader)。

結論

それで、それらはすべての使用法で交換可能ですか?

はい。

そして、これら2つのモナドを異なることの実際の重要性は何ですか?

なし。ただしReaderT実際にはモナド変換子であるため、作業が簡単になります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Reader Monadのローカル関数の目的は何ですか?

分類Dev

Haskellモナドの `let .. indo`と` <-`表記の違いは何ですか?

分類Dev

Scala標準APIで同等のIOHaskell Monadとは何ですか?

分類Dev

ファンクターとモナドの違いは何ですか?

分類Dev

ライターモナドとリストライターモナドの違いは何ですか

分類Dev

MonoidKとMonadの関係

分類Dev

ReaderとInputStreamの違いは何ですか?

分類Dev

すべてのモナド変換子 `t`に対してタイプ` Monad m => t Identity a-> tma`の関数を書くことは可能ですか?

分類Dev

リーダーモナドとClojureの部分関数の違いは何ですか?

分類Dev

Docker SwarmモードとSwarmモードの違いは何ですか?

分類Dev

自由モノイドとモノイドの主な違いは何ですか?

分類Dev

docker BRIDGEモードとHOSTモードの違いは何ですか?

分類Dev

管理モードと無差別モードの違いは何ですか?

分類Dev

Readerモナドの利点は何ですか?

分類Dev

Applicative / Monadの両方がモノイド構造を保持しているが、わずかに異なる方法であるという実際的な意味は何ですか?

分類Dev

SATAドライブ:IDEモードとAHCIの違いは何ですか?

分類Dev

ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

分類Dev

PHPのfopenモード "r +"と "rw +"の違いは何ですか?

分類Dev

PHPのfopenモード "r +"と "rw +"の違いは何ですか?

分類Dev

LinuxMintシナモンのウィンドウのタイリングとスナップの違いは何ですか

分類Dev

実体関連モデルとリレーショナルモデルの違いは何ですか?

分類Dev

FTPでは、パッシブモードと拡張パッシブモードの違いは何ですか?

分類Dev

rootターミナルとsudoの違いは何ですか?

分類Dev

PILの「P」モードと「L」モードの画像の違いは何ですか?

分類Dev

Spark Streamingの追加モードと更新モードの本当の違いは何ですか?

分類Dev

C ++ ifstream、ofstream:生のread()/ write()呼び出しとバイナリモードでファイルを開くことの違いは何ですか?

分類Dev

C ++ ifstream、ofstream:生のread()/ write()呼び出しとバイナリモードでファイルを開くことの違いは何ですか?

分類Dev

DjangoモデルのSlugField()とCharField()の違いは何ですか

分類Dev

CとC ++のメモリ管理の違いは何ですか

Related 関連記事

  1. 1

    Reader Monadのローカル関数の目的は何ですか?

  2. 2

    Haskellモナドの `let .. indo`と` <-`表記の違いは何ですか?

  3. 3

    Scala標準APIで同等のIOHaskell Monadとは何ですか?

  4. 4

    ファンクターとモナドの違いは何ですか?

  5. 5

    ライターモナドとリストライターモナドの違いは何ですか

  6. 6

    MonoidKとMonadの関係

  7. 7

    ReaderとInputStreamの違いは何ですか?

  8. 8

    すべてのモナド変換子 `t`に対してタイプ` Monad m => t Identity a-> tma`の関数を書くことは可能ですか?

  9. 9

    リーダーモナドとClojureの部分関数の違いは何ですか?

  10. 10

    Docker SwarmモードとSwarmモードの違いは何ですか?

  11. 11

    自由モノイドとモノイドの主な違いは何ですか?

  12. 12

    docker BRIDGEモードとHOSTモードの違いは何ですか?

  13. 13

    管理モードと無差別モードの違いは何ですか?

  14. 14

    Readerモナドの利点は何ですか?

  15. 15

    Applicative / Monadの両方がモノイド構造を保持しているが、わずかに異なる方法であるという実際的な意味は何ですか?

  16. 16

    SATAドライブ:IDEモードとAHCIの違いは何ですか?

  17. 17

    ScalaでReaderとWriterのモナドを使用するにはどうすればよいですか?

  18. 18

    PHPのfopenモード "r +"と "rw +"の違いは何ですか?

  19. 19

    PHPのfopenモード "r +"と "rw +"の違いは何ですか?

  20. 20

    LinuxMintシナモンのウィンドウのタイリングとスナップの違いは何ですか

  21. 21

    実体関連モデルとリレーショナルモデルの違いは何ですか?

  22. 22

    FTPでは、パッシブモードと拡張パッシブモードの違いは何ですか?

  23. 23

    rootターミナルとsudoの違いは何ですか?

  24. 24

    PILの「P」モードと「L」モードの画像の違いは何ですか?

  25. 25

    Spark Streamingの追加モードと更新モードの本当の違いは何ですか?

  26. 26

    C ++ ifstream、ofstream:生のread()/ write()呼び出しとバイナリモードでファイルを開くことの違いは何ですか?

  27. 27

    C ++ ifstream、ofstream:生のread()/ write()呼び出しとバイナリモードでファイルを開くことの違いは何ですか?

  28. 28

    DjangoモデルのSlugField()とCharField()の違いは何ですか

  29. 29

    CとC ++のメモリ管理の違いは何ですか

ホットタグ

アーカイブ