콘크리트 모나드 스택 대신에 typeclasses를 사용하여 함수를 모나드 얼릭으로 만들 수 있습니다. ,
bangMe :: Monad m => StateT String m()
을하지만 :
물론
bangMe :: State String()
bangMe = do
str <- get
put $ str ++ "!"
-- or just modify (++"!")
, 당신은 그것뿐만 아니라 변압기로 작동하는지 깨닫는 사람이 쓸 수 있도록 :
은의 당신이 예를 들어,이 기능을한다고 가정 해 봅시다 다른 스택을 사용하는 함수가있는 경우 ReaderT [String] (StateT String IO)()
또는 무엇이든간에 두려워하는 lift
함수를 사용해야합니다. 어떻게 피할 수 있습니까?
트릭은 함수 서명을 더욱 일반화하여 State
모나드가 모나드 스택의 어느 위치 에나 나타날 수 있다고 말합니다.
이
bangMe :: MonadState String m => m()
이 어디 모나드 스택 (거의) 상태를 지원하는 모나드로 m
을 강제하고, 기능 따라서 이러한 스택 떼지 않고 작동합니다 : 이것은 다음과 같이 이루어집니다.
하나의 문제가 있습니다. IO
은 mtl
의 일부가 아니기 때문에 변압기 (예 : IOT
) 또는 기본 별 편리한 유형 클래스가 없습니다. IO 작업을 임의로 수행하려는 경우 어떻게해야합니까?
구조에 관해서는 MonadIO
!MonadState
, MonadReader
등과 거의 동일하게 작동합니다. 유일한 차이점은 약간 다른 리프팅 메커니즘이 있다는 점입니다. 다음과 같이 작동합니다. IO
작업을 수행하고 liftIO
을 사용하여 모나드 불가 지론 버전으로 변환합니다. 그래서 :
action :: IO()
liftIO action :: MonadIO m => m()
이 방법으로 사용하고자하는 모나드 모든 작업을 변환함으로써, 당신은 어떤 지루한 리프팅없이 원하는만큼 모나드를 꼬이는 수 있습니다.
오, 나는 바보 같다고 생각합니다. 이전 답변 중 하나에서, 나는 그 시간에 그것을 이해할 수 없다고 언급했습니다. 자, 고마워! – aelguindy