Programing

Haskell : lift 대 liftIO

lottogame 2020. 10. 17. 09:00
반응형

Haskell : lift 대 liftIO


어떤 상황에서 사용해야 liftIO합니까? 내가 사용하는 경우 ErrorT String IOlift기능에 IO 조치를 해제하기 위해 노력하고 ErrorT있으므로, liftIO불필요한 보인다.


lift항상 "이전"레이어에서 해제됩니다. 두 번째 레이어에서 들어 올려야하는 경우 필요합니다 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에 대한 지름길 일뿐입니다. 어떤 Monad에 있든 기본적으로 liftIO는 다양한 수의 리프트를 사용하는 것과 같습니다. 처음에는 중복 된 것처럼 들릴 수 있지만 liftIO를 사용하면 한 가지 큰 이점이 있습니다. IO 코드가 실제 Monad 구성에 종속되지 않게하여 최종 Monad가 구축 된 레이어 수에 관계없이 동일한 코드를 재사용 할 수 있습니다 (이것은 매우 중요합니다 모나드 변환기를 작성할 때).

다른 한편으로, liftIO는 리프트처럼 무료로 제공되지 않습니다. 사용중인 Monad 변환기는이를 지원해야합니다. 예를 들어 사용중인 Monad는 MonadIO 클래스의 인스턴스 여야하지만 오늘날 대부분의 Monads는 (물론 타입-체커는 컴파일 타임에 이것을 검사 할 것입니다 : 이것이 Haskell의 강점입니다!).

참고 URL : https://stackoverflow.com/questions/3921237/haskell-lift-vs-liftio

반응형