1. ホーム
  2. haskell

[解決済み] Haskell: lift vs liftIO

2023-06-28 21:56:18

質問

どのような状況で 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