ReaderT内でリストモナドを使用するにはどうすればよいですか?

ダニエルK

リストタイプにReader/ ReaderTtoを使用するにはどうすればよいですか?askたとえば[(Int, Int)]、(ask編集されたタイプの)リストモナド内で計算を実行しますか?

私の壊れたコードは次のとおりですが、わかりやすくするために短縮されています。

attempt :: Int -> Int -> ReaderT [(Int,Int)] [] [[Int]]
attempt start end =
  do  (s0, e0) <- ask
      return [0]

私がやろうとしていることを理解するために、ここに同じ関数があります。リストモナドを使用していますが、リーダーは使用していません。

paths :: [(Int, Int)] -> Int -> Int -> [[Int]]
paths edges start end =
  if start == end
    then return [end]
    else do   (s0, e0) <- edges
              guard $ s0 == start
              subpath <- paths edges e0 end
              return $ s0 : subpath

私はモナド変換子を学んでいるので、ReaderTを使用しています。これは、リーダーとライターの両方を使用し、モナドをリストしてパスを実装するという、より大きな問題の一部です。

デビッドミアーニ

ここでの秘訣は、liftを使用して、次を使用してリストモナド(つまり、[a])をに変換するReaderT env []ことliftです。

lift :: (Monad m, MonadTrans t) => m a -> t m a

またはモナドスタックに特化:

lift :: [a] -> ReaderT [(Int,Int)] [] a

askモナドに[(Int, Int)]ラップされた状態(つまり)を返します。ReaderT例:

ask :: ReaderT [(Int, Int)] [] [(Int, Int)]

同じモナドで、次のタイプの別の値に変換します。

??? :: ReaderT [(Int, Int)] [] (Int, Int)

したがって、代替案は、出力ではなくモナドによって追跡されます。基本的な機能を考えてみましょう>>=

(>>=) :: Monad m => m a -> (a -> m b) -> m b

必要なすべての部品が揃っていることがわかります。使用ask >>= lift

  1. 最初の引数は、あるReaderT [(Int, Int)] [] [(Int, Int)]意味では、aあり[(Int, Int)]、そしてmありますReaderT [(Int, Int)] []
  2. 我々は結果が欲しいm bするReaderT [(Int, Int)] [] (Int, Int)ので、bあります(Int, Int)
  3. したがって、関数にはタイプが必要[(Int, Int)] -> ReaderT [(Int, Int)] [] (Int, Int)です。関数a内のをに置き換えると、完全に一致します。つまり、式が必要なことを実行します。lift(Int, Int)ask >>= lift

もう1つの間違いは、ReaderTモナドの出力タイプでした。リストモナドが含まれていたため、結果を別の角かっこで囲む必要はありませんでした。にはReaderT state []すでに複数の結果の概念が含まれており、この場合の単一の結果[Int]はグラフパスを示しています。

動作するコードは次のとおりです。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Main where
import Control.Monad.Reader
import Control.Applicative


paths :: Int -> Int -> ReaderT [(Int,Int)] [] [Int]
paths start end = do
  if start == end
     then return [end]
     else do
      (s0, e0) <- ask >>= lift
      guard $ s0 == start
      (s0 :) <$> paths e0 end


input :: [(Int, Int)]
input = [(1,2), (2,7), (3,4), (7, 3), (7, 5), (5, 3)]

test :: [[Int]]
test = runReaderT (paths 2 4) input


> test
[[2,7,3,4],[2,7,5,3,4]]

それがそれを明確に説明していることを願っています。この状況では、おそらく元の解決策に固執するでしょう(Reader通常、それ自体を使用することはあまり役に立ちません)が、モナドとモナド変換子のタイプを理解して操作する方法を知っておくのは良いことです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

StateT、ContT、およびReaderTを使用してモナドを作成するにはどうすればよいですか?

分類Dev

リモートでリスナーを作成するにはどうすればよいですか

分類Dev

リモートでリスナーを作成するにはどうすればよいですか

分類Dev

C ++でストリームをテキストモードからバイナリに変更するにはどうすればよいですか?

分類Dev

リストモナドにエラー処理を追加するにはどうすればよいですか?どのデータ型が必要ですか?

分類Dev

Parsecのモナド内でIOを実行するにはどうすればよいですか?

分類Dev

HaskellのStateモナドを使用してリストアイテムを数えるにはどうすればよいですか?

分類Dev

Pythonで文字列のリスト内で「.endswith」を使用するにはどうすればよいですか?

分類Dev

divで「keydown」イベントリスナーを使用するにはどうすればよいですか?

分類Dev

divで「keydown」イベントリスナーを使用するにはどうすればよいですか?

分類Dev

フルスクリーンモードでKeyboardAvoidingViewを使用するにはどうすればよいですか?

分類Dev

デスクトップアプリでナイトモードでSlackを実行するにはどうすればよいですか?

分類Dev

--prodモードでngForリストの問題を修正するにはどうすればよいですか?

分類Dev

Javaでstdinモードをバイナリに設定するにはどうすればよいですか?

分類Dev

ネストされたモナドでバインドを使用するにはどうすればよいですか?

分類Dev

PySparkスクリプトでpmmlモデルを使用するにはどうすればよいですか?

分類Dev

リンクリスト内の内部ノードを印刷するにはどうすればよいですか?

分類Dev

bashスクリプト内で$ SECONDSを使用するにはどうすればよいですか?

分類Dev

jmeter groovyスクリプト内でcsv変数を使用するにはどうすればよいですか?

分類Dev

bashスクリプト内で$ SECONDSを使用するにはどうすればよいですか?

分類Dev

リスト付きのforループ内で.each()を使用するにはどうすればよいですか?

分類Dev

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

分類Dev

bashスクリプト内でsourceを使用してターミナルプロンプトを変更するにはどうすればよいですか?

分類Dev

Ubuntu 20.04で自動ナイトモードを設定するにはどうすればよいですか?

分類Dev

pyvmomiを使用してESXiホストをメンテナンスモードにするにはどうすればよいですか?

分類Dev

kubernetesポッド内のすべてのコンテナを明確にリストするにはどうすればよいですか?

分類Dev

「onDataChange」リスナー内からArrayListに文字列を追加するにはどうすればよいですか?

分類Dev

ターミナルで最もよく使用されるコマンドのリストを作成するにはどうすればよいですか?

分類Dev

スクリプトを使用して<a>タグ内のリンクをナビゲートするにはどうすればよいですか?

Related 関連記事

  1. 1

    StateT、ContT、およびReaderTを使用してモナドを作成するにはどうすればよいですか?

  2. 2

    リモートでリスナーを作成するにはどうすればよいですか

  3. 3

    リモートでリスナーを作成するにはどうすればよいですか

  4. 4

    C ++でストリームをテキストモードからバイナリに変更するにはどうすればよいですか?

  5. 5

    リストモナドにエラー処理を追加するにはどうすればよいですか?どのデータ型が必要ですか?

  6. 6

    Parsecのモナド内でIOを実行するにはどうすればよいですか?

  7. 7

    HaskellのStateモナドを使用してリストアイテムを数えるにはどうすればよいですか?

  8. 8

    Pythonで文字列のリスト内で「.endswith」を使用するにはどうすればよいですか?

  9. 9

    divで「keydown」イベントリスナーを使用するにはどうすればよいですか?

  10. 10

    divで「keydown」イベントリスナーを使用するにはどうすればよいですか?

  11. 11

    フルスクリーンモードでKeyboardAvoidingViewを使用するにはどうすればよいですか?

  12. 12

    デスクトップアプリでナイトモードでSlackを実行するにはどうすればよいですか?

  13. 13

    --prodモードでngForリストの問題を修正するにはどうすればよいですか?

  14. 14

    Javaでstdinモードをバイナリに設定するにはどうすればよいですか?

  15. 15

    ネストされたモナドでバインドを使用するにはどうすればよいですか?

  16. 16

    PySparkスクリプトでpmmlモデルを使用するにはどうすればよいですか?

  17. 17

    リンクリスト内の内部ノードを印刷するにはどうすればよいですか?

  18. 18

    bashスクリプト内で$ SECONDSを使用するにはどうすればよいですか?

  19. 19

    jmeter groovyスクリプト内でcsv変数を使用するにはどうすればよいですか?

  20. 20

    bashスクリプト内で$ SECONDSを使用するにはどうすればよいですか?

  21. 21

    リスト付きのforループ内で.each()を使用するにはどうすればよいですか?

  22. 22

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

  23. 23

    bashスクリプト内でsourceを使用してターミナルプロンプトを変更するにはどうすればよいですか?

  24. 24

    Ubuntu 20.04で自動ナイトモードを設定するにはどうすればよいですか?

  25. 25

    pyvmomiを使用してESXiホストをメンテナンスモードにするにはどうすればよいですか?

  26. 26

    kubernetesポッド内のすべてのコンテナを明確にリストするにはどうすればよいですか?

  27. 27

    「onDataChange」リスナー内からArrayListに文字列を追加するにはどうすればよいですか?

  28. 28

    ターミナルで最もよく使用されるコマンドのリストを作成するにはどうすればよいですか?

  29. 29

    スクリプトを使用して<a>タグ内のリンクをナビゲートするにはどうすればよいですか?

ホットタグ

アーカイブ