Haskell:なぜこのモナド変換が間違っているのですか?

sqd

私はモナド変換子を研究していて、sを回避する方法についてこのSOの投稿を読みましたlift

私の考えでは、それMonadIOIO埋め込むことができるモナドであり埋め込むことができるMonadWriter wモナドWriterT wです。そこで、以下のコードを記述しました(ゼロになるまで数値を読み取り、累積し、記録します)。ここでliftは、explicitを使用した作業バージョンがコメントに含まれています。しかし、GHCは文句を言います。私は何が間違っているのですか?

{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.IO.Class
import Control.Monad.Writer.Class (MonadWriter)
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer

-- f :: ReaderT Int (WriterT [String] IO) Int
-- m1 = ReaderT, m2 = WriterT
f :: (MonadWriter [String] m1, MonadIO m2) => m1 (m2 (IO Int))
f = do
    s <- liftIO getLine
    tell ["Input: " ++ s] -- lift $ tell ["Input: " ++ s]
    let i = read s :: Int
    if i == 0
       then ask
       else local (+i) f

main = do
    rst <- runWriterT $ runReaderT f 0
    print rst
ゼータ

私の考えでは、MonadIOはIOを埋め込むことができるモナドであり、MonadWriterwはWriterTwを埋め込むことができるモナドです。

それは完全には正しくありません。MonadIOsはliftIO、をMonadWriter使用できはを使用できますtellあなたが使用したい場合はそのため、liftIOtellasklocal持ち上げずに同じコンテキスト/モナドでは、単一使用モナドは、それらのすべてのインスタンスでなければなりません。

f :: ( MonadWriter [String] m -- monad supports  tell   :: [String] -> m ()
     , MonadReader Int      m -- monad supports  ask    ::             m Int
     , MonadIO              m -- monad supports  liftIO :: IO a     -> m a
     )         =>  m Int      -- only a single m

を使用することはできませんがtransformermtl自動リフトを取得するために使用できることに注意してくださいしたがって、インポートも変更されます。

import Control.Monad.Reader (runReaderT, MonadReader)
import Control.Monad.Writer (runWriterT, MonadWriter)
import Control.Monad.IO.Class (liftIO, MonadIO)

アクションが自動的に解除されることMonadIOはないため、のインポートは変更されませんIO

ところで、あなたの使用runWriterTとはrunReaderT、これが使用されますので、すでに、すべてのあいまいさに変圧器スタックを削除します

ReaderT Int (WriterT [String] IO Int)

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ソナーがこの表現が常に間違っていると考えるのはなぜですか

分類Dev

この単一の出力が間違っているのはなぜですか?

分類Dev

この単一の出力が間違っているのはなぜですか?

分類Dev

変数を配列に入れないようにこのコードを変換する際にどこが間違っているのですか?

分類Dev

このクエリが間違っているのはなぜですか?

分類Dev

文字列配列の回文のこのコードが間違っているのはなぜですか

分類Dev

なぜこれは次のコードの出力がGO言語で間違っているのですか?

分類Dev

Dartでこの最終フィールドの初期化が間違っているのはなぜですか?

分類Dev

Swingスレッドモデルが間違っていると見なされるのはなぜですか?

分類Dev

C ASCIIの乱数、なぜこのコードが間違っているのですか?

分類Dev

なぜこの例外が発生するのか、ここで何が間違っているのか

分類Dev

Javascriptなぜこれが間違っているのですか?10> 9> 8 === true;

分類Dev

このコードが間違った計算をしているのはなぜですか?

分類Dev

この出力が間違っているのはなぜですか(get / setメソッド)

分類Dev

このQuickSortパーティションメソッドが間違っているのはなぜですか?

分類Dev

次のPythonコードが間違っているのはなぜですか?

分類Dev

このコードが機能しないことはわかっていますが、見つけたコードが機能するのはなぜですか?何が間違ったコードを間違っているのですか?

分類Dev

なぜ1 === 1 === 1が間違っているのですか?

分類Dev

「zzz」-le「~~~」が間違っているのはなぜですか?

分類Dev

["text"] == ["text"]が間違っているのはなぜですか?

分類Dev

x <= xが間違っているのはなぜですか?

分類Dev

XOR出力が間違っているのはなぜですか

分類Dev

b [2]が間違っているのはなぜですか?

分類Dev

CSSなぜ幅が間違っているのですか?

分類Dev

再帰的にメモされたフィボナッチコードが間違っているのはなぜですか?

分類Dev

角度コードが間違っているのはなぜですか?

分類Dev

変換を絞り込んでも、間違ったタイプのこのmap.insert()が失敗するのを防げないのはなぜですか?

分類Dev

この単純な例で私の背景が間違って配置されているのはなぜですか

分類Dev

このメソッドをモックすることで何が間違っているのですか?

Related 関連記事

  1. 1

    ソナーがこの表現が常に間違っていると考えるのはなぜですか

  2. 2

    この単一の出力が間違っているのはなぜですか?

  3. 3

    この単一の出力が間違っているのはなぜですか?

  4. 4

    変数を配列に入れないようにこのコードを変換する際にどこが間違っているのですか?

  5. 5

    このクエリが間違っているのはなぜですか?

  6. 6

    文字列配列の回文のこのコードが間違っているのはなぜですか

  7. 7

    なぜこれは次のコードの出力がGO言語で間違っているのですか?

  8. 8

    Dartでこの最終フィールドの初期化が間違っているのはなぜですか?

  9. 9

    Swingスレッドモデルが間違っていると見なされるのはなぜですか?

  10. 10

    C ASCIIの乱数、なぜこのコードが間違っているのですか?

  11. 11

    なぜこの例外が発生するのか、ここで何が間違っているのか

  12. 12

    Javascriptなぜこれが間違っているのですか?10> 9> 8 === true;

  13. 13

    このコードが間違った計算をしているのはなぜですか?

  14. 14

    この出力が間違っているのはなぜですか(get / setメソッド)

  15. 15

    このQuickSortパーティションメソッドが間違っているのはなぜですか?

  16. 16

    次のPythonコードが間違っているのはなぜですか?

  17. 17

    このコードが機能しないことはわかっていますが、見つけたコードが機能するのはなぜですか?何が間違ったコードを間違っているのですか?

  18. 18

    なぜ1 === 1 === 1が間違っているのですか?

  19. 19

    「zzz」-le「~~~」が間違っているのはなぜですか?

  20. 20

    ["text"] == ["text"]が間違っているのはなぜですか?

  21. 21

    x <= xが間違っているのはなぜですか?

  22. 22

    XOR出力が間違っているのはなぜですか

  23. 23

    b [2]が間違っているのはなぜですか?

  24. 24

    CSSなぜ幅が間違っているのですか?

  25. 25

    再帰的にメモされたフィボナッチコードが間違っているのはなぜですか?

  26. 26

    角度コードが間違っているのはなぜですか?

  27. 27

    変換を絞り込んでも、間違ったタイプのこのmap.insert()が失敗するのを防げないのはなぜですか?

  28. 28

    この単純な例で私の背景が間違って配置されているのはなぜですか

  29. 29

    このメソッドをモックすることで何が間違っているのですか?

ホットタグ

アーカイブ