#haskell
#haskell
Вопрос:
Скажем, я пишу библиотеку, которая предоставляет ReaderT
монаду, которая выглядит как…
data LibEnv = LibEnv { envThreadUnsafeResource :: _whatever }
type LibraryT = ReaderT LibEnv
Как мне запретить пользователю моей библиотеки вызывать forkIO
из MonadIO m => LibraryT m
монады без повторной инициализации envThreadUnsafeResource
?
Ответ №1:
Я бы предложил _whatever
перенести в a Pool _whatever
из resource-pool
библиотеки, которая обычно используется для управления подключениями к базе данных и т.д.
Чтобы создать a Pool _whatever
, вам нужно будет предоставить a IO _whatever
для построения ресурса и a _whatever -> IO ()
для уничтожения ресурса. Если вы затем получите доступ _whatever
, используя только с помощью withResource
функции, то вы можете получить свежую инициализацию _whatever
независимо от того, в каком потоковом контексте вы находитесь.