ile Çalışıyorum Şu anda Bryan O'Sullivan'ın resource-pool kitaplığında çalışıyorum ve withResource
işlevini genişletmeyle ilgili bir sorum var. (MonadBaseControl IO m) => Pool a -> (a -> m b) -> m b
'dan (MonadBaseControl IO m) => Pool a -> (a -> m (Bool, b)) -> m b
'a withResource
işlevinin imzasını değiştirmek istiyorum.
Elde etmek istediğim, eylemin, havuza geri gönderilmesi veya yok edilmesi durumunda, boolean değerinin, boolean değerinin gösterileceği yerde (Bool, b)
tuple dönmesidir.`MonadBaseControl` API
withResource :: forall m a b. (MonadBaseControl IO m) => Pool a -> (a -> m (Bool, b)) -> m b
{-# SPECIALIZE withResource :: Pool a -> (a -> IO (Bool,b)) -> IO b #-}
withResource pool act = fmap snd result
where
result :: m (Bool, b)
result = control $ \runInIO -> mask $ \restore -> do
resource <- takeResource pool
ret <- restore (runInIO (act resource)) `onException`
destroyResource pool resource
void . runInIO $ do
(keep, _) <- restoreM ret :: m (Bool, b)
if keep
then liftBaseWith . const $ putResource pool resource
else liftBaseWith . const $ destroyResource pool resource
return ret
Ve bunu Belki MonadBaseControl
API hakkı kullanmıyorum ... gibi bakmak gerekiyordu nasıl bu olmadığını, bir duygu var:
Şimdi benim şimdiki uygulama aşağıdaki gibi görünüyor. Bunun hakkında ne düşünüyorsunuz ve daha idiyotik olmak için onu nasıl geliştirebilirim?
Müthiş bir bakış iyi görünüyor. Seni bu konuda ne rahatsız ediyor? – luqui
@luqui Beni biraz rahatsız eden, runInIO'yu iki kez çalıştırmam gerektiğidir, bu da daha ayrıntılı kodlara neden olur. IO monad içindeki "ret" (ilk "runInIO" çağrısının sonucu) açmak için daha iyi bir yolu var mı? – bmk