2012-11-22 8 views
3

나는 다음과 같은 두 가지 Kleisli 화살표를 한 경우 : 내가 좋아하는가 someting 쓸 수 있도록하고 싶습니다 Kleisli 화살표를 IO로 들어 올리시겠습니까?

stdoutProcessA :: Kleisli Maybe String (IO String) 
writeToFileA :: Kleisli Maybe (FilePath, String) (IO()) 

: 물론 작동하지 않습니다

compile = proc src -> do 
    output <- stdoutProcessA -< "..." 
    writeToFileA -< ("...", output) 
    ... 

String 때문에 일치하지 않습니다 IO String. 반면에 stdoutProcessAwriteToFileA을 모두 Kleisli IO ... 유형으로 정의 할 수는 있지만 다른 것들에 필요한 Kleisli Maybe ... 유형의 화살표로 작성할 수는 없습니다.

저는 아직 화살표에 익숙하지 않아서 분명히 뭔가 빠져 있습니다. 위의 작업을 수행하려면 어떻게해야할까요?

답변

5

이 화살표는 나에게 많은 이해가되지 않습니다

stdoutProcessA :: Kleisli Maybe String (IO String) 
writeToFileA :: Kleisli Maybe (FilePath, String) (IO()) 

그들은 당신이 아마 IO (Maybe a)을 의미하는 결과 Maybe (IO a)와 기능을 나타냅니다. 후자 유형은 IO 작업을 나타냅니다. 이전에는 오류 또는 성공이 IO에 전혀 의존 할 수 없습니다.

IOMaybe을 결합하는 올바른 방법은 지금처럼 MaybeT 모나드 변압기를 사용하는 것입니다 : 당신이 Monad m => Kleisli (MaybeT m) a b 같은 다른 화살표를 작성하는 경우

stdoutProcessA :: Kleisli (MaybeT IO) String String 
writeToFileA :: Kleisli (MaybeT IO) (FilePath, String)() 

, 그들이 어떤 리프팅없이이 사람과 잘 구성해야한다. 다른 방법으로는 필요한 곳에 Kleisli (MaybeT IO)에 기존 Kleisli Maybe 화살표를 들어 올릴

lift' :: Monad m => Kleisli Maybe a b -> Kleisli (MaybeT m) a b 
lift' (Kleisli f) = Kleisli $ \x -> MaybeT (return $ f x) 

를 사용할 수 있습니다.

+0

그렇습니다. 실제로 'Kleisli IO String String'과 'Kleisli IO (FilePath, String)()'유형을 사용하는 것이 훨씬 더 합리적입니다. 그러나 나는 다른 유형과 결합 할 수 없습니다. 'Kleisli Maybe' 유형의 화살표 - 다른 모나드에서 Kleise 화살표를 결합하는 방법이 있습니까? –