Haskell:Lift vs Liftio
-
29-09-2019 - |
質問
どのような状況で 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の強さです!)。
所属していません StackOverflow