는 데이터 유형 F
및 유형의 기능을 제공하는 라이브러리가`IO` 모나드에서 실행되는 계산을 종료하는 법?
ffoldlIO :: (b -> a -> IO b) -> b -> F a -> IO b
기능은
foldlIO :: (b -> a -> IO b) -> b -> [a] -> IO b
foldlIO f a = \xs -> foldr (\x r (!a') -> f a' x >>= r) return xs a
내가 foldlIO
(따라서 ffoldlIO
)이 짧은에서 실행할 수 있는지 여부를 궁금해 유사하다 - 회로 패션. 우리는 예외 계산을 중지 한 다음 그것을 잡으려고을 던져
example1 :: IO Int
example1 = foldlIO (\a x -> if a < 4 then return (a + x) else return a) 0 [1..5]
foldlIO
전체 목록,하지만를 통과 :
data Terminate = Terminate
deriving (Show)
instance Exception Terminate
example2 :: IO Int
example2 = do
ra <- newIORef 0
let step a x
| a' < 4 = return a'
| otherwise = writeIORef ra a' >> throwIO Terminate
where a' = a + x
foldlIO step 0 [1..] `catch` \(_ :: Terminate) -> readIORef ra
믿을만한가요? IO
모나드 (및 다른 모나드)에서 실행되는 계산을 종료하는 더 좋은 방법이 있습니까? 아니면이 작업을 전혀 수행하지 않아도됩니까?
이것은 다소 비슷합니다. 'ContT'는 초심자로 유명하기 때문에 더 많은 코멘트가 도움이 될 것입니다. 나는 또한'lift (putStrLn "foo") >> ...'를 어딘가에 추가하여'ContT _ IO _' 내에서 IO를하는 방법을 보여줄 것을 제안 할 것이다. – chi
이 계산은 내가 요청한대로'IO' 대신'ContT Int IO Int'에서 실행됩니다. 나는 그 질문을 덜 혼란스럽게 만들기 위해 편집 할 것이다, 미안하다. – user3237465
"당신은 자신 만의'foldM' 버전을 정의 할 수 있습니다. - 할 수 없습니다 : 라이브러리는'ffoldlIO' 만 제공하고 제 자신의'foldM'을 구현하기에는 너무 복잡합니다. 질문의 목록은 내가 성취하고자하는 것을 보여주는 예일뿐입니다. – user3237465