Я не уверен, что это то, что вам нужно, но звучит так, будто вы ищете функцию
forkJ :: J () -> J ThreadId
, которая похожа на forkIO, но вместо этого работает в J-контексте.Вообще говоря, все точки dflemstr действительны.Есть много нерешенных вопросов об управлении состоянием из-за чистоты Haskell.
Однако, если вы хотите немного перестроить свою логику, один вариант, который может работать для вас (если все, что вы ищете, этоотдельный поток с доступом к исходному состоянию при выдаче форка) - это pakcage lifted-base , который зависит от монад-контроля.Это, по сути, даст вам функцию forkJ, указанную выше, до тех пор, пока у вас есть IO в нижней части стека трансформаторов.
Теперь, если вы хотите, чтобы 2 потока взаимодействовали с состоянием, таким образом, чтобы ошибки возникали вchild передаются в основной поток как часть механизма ErrorT, это просто невозможно (как объяснил dflemstr).Однако вы можете установить канал связи между двумя потоками, используя конструкцию из семейства модулей Control.Concurrent.Один из следующих модулей может иметь то, что вам нужно:
Control.Concurrent.Chan
Control.Concurrent.MVar
Control.Concurrent.STM