У меня естьСэмплирование MVar, могу ли я избежать небезопасногоPerformIO?
sample :: MVar a -> IO [a]
sample v = do
a <- takeMVar v
pure (a:unsafePerformIO (sample v))
, который, как представляется, является законным использование unsafePerformIO
мне. Но мне очень интересно знать, как этого избежать! Есть ли образец для этого использования уже?
Как это более опасно, чем действие readLn. В конце концов, результат IO [a] – heisenbug
Я не был бы уверен, что это законное использование Fᴜɴᴄᴛɪᴏɴ ᴛʜᴀᴛ ꜱʜᴀʟʟ ɴᴏᴛ ʙᴇ ɴᴀᴍᴇᴅ. С параллелизмом в игре есть всевозможные вещи, которые могут пойти не так, если компилятор ошибается с предположениями прозрачности прозрачности. Если 'sample' работал действительно безопасно, то это, вероятно, уже было в библиотеке. – leftaroundabout
Если вы собираетесь использовать «небезопасный» маршрут, вы должны, по крайней мере, использовать здесь 'unsafeInterleaveIO', который является предполагаемым методом реализации ленивого ввода-вывода. Обратите внимание, что 'getChanContents' сам использует' unsafeInterleaveIO' для ленивого создания всего содержимого Chan. – user2407038