質問

どのような状況で liftIO 利用される?私が使用しているとき ErrorT String IO, 、 lift 関数はIOアクションを持ち上げるために機能します ErrorT, 、 それで liftIO 余分なようです。

役に立ちましたか?

解決

lift 常に「前の」レイヤーから持ち上げます。 2番目のレイヤーから持ち上げる必要がある場合は、 lift . lift 等々。

一方で、 liftIO 常にIOレイヤー(存在する場合、常にスタックの下部にあります)から持ち上げます。だから、あなたが2層以上のモナドを持っているなら、あなたは感謝するでしょう liftIO.

次のラムダの議論のタイプを比較してください。

type T = ReaderT Int (WriterT String IO) Bool

> :t \x -> (lift x :: T)
\x -> (lift x :: T) :: WriterT String IO Bool -> T

> :t \x -> (liftIO x :: T)
\x -> (liftIO x :: T) :: IO Bool -> T

他のヒント

Liftioは、IO Monadへの近道にすぎません。どちらのモナッドにいても、Liftioはさまざまな数のリフトを使用することに等しくなります。最初はこれが冗長に聞こえるかもしれませんが、Liftioを使用するには1つの大きな利点があります。実際のMonad構造のIOコードを紹介するので、最終的なMonadが構築された層の数に関係なく同じコードを再利用できます(これは非常に重要です。モナドトランスを書くとき)。

Ohter Handでは、Liftioは無料で提供されていません。リフトのように:あなたが使用しているMonad Transformersにはサポートが必要です。 (そしてもちろん、タイプチェッカーはコンパイル時間でこれをチェックします。それがHaskellの強さです!)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top