Описание тега unsafe-perform-io

Этот тег предназначен для вопросов, касающихся функции ʻunsafePerformIO` в Haskell и Scala, которая позволяет выполнять произвольный ввод-вывод внутри чистого выражения.
1 ответ

Почему я не могу записать значение в IORef, но могу его прочитать

В haskell мне нужна глобальная переменная, поэтому я решил использовать слот IORef, вот мой план: memo :: IORef Int memo = unsafePerformIO $ newRefInt 9999 evaluate ARGs s = do v <- Right $ unsafePerformIO $ readIORef memo val <- Right $ VInt …
04 дек '13 в 23:43
2 ответа

Инициализация библиотеки unsafePerformIO и FFI

Я создаю модуль FFI для библиотеки в C, которая хочет, чтобы единовременная не реентерабельная функция вызывалась раньше, чем что-либо еще. Этот вызов идемпотентен, но с состоянием, так что я мог бы просто вызывать его при каждом вызове на Haskell. …
03 янв '13 в 18:46
2 ответа

Риски использования unsafeperformIO на randomIO

Я создаю приложение на Haskell, которое генерирует случайное число в бесконечном цикле (только по запросу клиента). Однако я должен использовать только чистые функции для этой цели. Это безопасно завернуть randomIO с unsafeperformIO без какой-либо р…
25 апр '13 в 06:54
5 ответов

Способ избежать общего использования unsafePerformIO

Я часто нахожу этот шаблон в коде на Haskell: options :: MVar OptionRecord options = unsafePerformIO $ newEmptyMVar ... doSomething :: Foo -> Bar doSomething = unsafePerformIO $ do opt <- readMVar options doSomething' where ... По сути, у кажд…
2 ответа

Тайм-аут и небезопасное выполнение

Я получаю некоторую практику в Haskell, исследую некоторые области, с которыми я не знаком, но я не могу понять поведение, которое я получаю, смешивая System.Timeout а также System.IO.Unsafe, Я лениво читаю поток, с getContents, фильтруя его с помощ…
2 ответа

Показать для типов ввода-вывода

У меня есть тип данных, который содержит IORef в качестве важного элемента. Это означает, что нет чистого способа сделать его членом show тип класс. Это не так уж плохо, так как у меня есть print функция в монаде IO для этого типа. Но в GHCi раздраж…
30 ноя '11 в 20:10
3 ответа

Путаница по поводу IORefs, чтобы сделать счетчик

Я нашел пример кода и немного изменил его counter = unsafePerform $ newIORef 0 newNode _ = unsafePerformIO $ do i <- readIORef counter writeIORef counter (i+1) return i Который возвращает 1, затем 2, затем 3, 3 и т. Д. При каждом запуске. Но когд…
16 дек '10 в 14:19
2 ответа

Как узнать, когда явно чистый интерфейс Haskell скрывает небезопасные операции?

Я читал о unsafePerformIO в последнее время, и я хотел бы спросить вас кое-что. Я согласен с тем фактом, что настоящий язык должен иметь возможность взаимодействовать с внешней средой, поэтому unsafePerformIO несколько оправдано. Тем не менее, наско…
3 ответа

Как написать функцию haskell без ввода-вывода в типе sig, скрывая изменения состояния

Я написал функцию в haskell, которая принимает несколько параметров, таких как Word32, String (игнорировать каррирование) и выводит IO Word32. Теперь это функция в истинном смысле: для одних и тех же входов выход всегда будет одинаковым. Там нет ник…
1 ответ

Выборка MVar, могу ли я избежать unsafePerformIO?

Я имею sample :: MVar a -> IO [a] sample v = do a <- takeMVar v pure (a:unsafePerformIO (sample v)) который представляется законным использованием unsafePerformIO мне. Но мне очень интересно знать, как этого избежать! Есть ли шаблон для этого …
01 мар '16 в 22:41
8 ответов

Действительно ли Haskell является чисто функциональным языком с учетом unsafePerformIO?

На Haskell обычно ссылаются как на пример чисто функционального языка. Как это может быть оправдано с учетом существования System.IO.Unsafe.unsafePerformIO? Редактировать: я думал, что под "чисто функциональным" подразумевалось, что невозможно ввест…
2 ответа

unsafePerformIO в многопоточных приложениях не работает

Ниже приведен источник примера программы: Когда я запускаю его из ghci, и printJob, и printJob2 работают нормально и записывают десять строк в текстовый файл. Но при компиляции с флагом -threaded программа записывает только одну строку. У меня ghc 7…
25 фев '12 в 23:54
3 ответа

(Отредактировано) Как получить случайное число в Хаскеле без ввода-вывода

Я хочу иметь функцию, которая возвращает разные stdGen в каждом звонке без IO. Я пытался использовать unsafePerformIO, как следующий код. import System.IO.Unsafe import System.Random myStdGen :: StdGen myStdGen = unsafePerformIO getStdGen Но когда я…
20 ноя '14 в 14:27
6 ответов

Генерация случайной строки во время компиляции или во время выполнения и использование ее в остальной части программы

Каков был бы лучший способ сделать это? unsafePerformIO? Шаблон Haskell? Что-то другое? Я никогда не использовал ни одного из них, поэтому я не знаю многих деталей их использования. Обратите внимание, что программа будет компилироваться при каждом з…
06 июл '13 в 06:03
4 ответа

Я злоупотребляю unsafePerformIO?

Познакомиться с unsafePerformIO (как использовать и когда использовать), я реализовал модуль для генерации уникальных значений. Вот что у меня есть: module Unique (newUnique) where import Data.IORef import System.IO.Unsafe (unsafePerformIO) -- Type …
15 окт '13 в 00:55
1 ответ

Как обернуть небезопасные FFI? (Haskell)

Это дополнительный вопрос к тому, есть ли когда-нибудь веская причина для использования unsafePerformIO? Итак, мы знаем, что p_sin(double *p) { return sin(*p); } небезопасно и не может быть использовано с unsafePerformIO, Но p_sin Функция по-прежнем…
22 авг '14 в 05:22
1 ответ

Безопасно ли использовать unsafeIOToSTM для чтения из базы данных?

В этом блоке псевдокода: atomically $ do if valueInLocalStorage key then readValueFromLocalStorage key else do value <- unsafeIOToSTM $ fetchValueFromDatabase key writeValueToLocalStorage key value Безопасно ли использовать unsafeIOToSTM? Докумен…
07 дек '15 в 10:01
2 ответа

Запоминание эффективной функции

Я начал работать над проектом, определяющим клеточный автомат как локальную функцию перехода: newtype Cellular g a = Cellular { delta :: (g -> a) -> a } Всякий раз, когда g это MonoidМожно определить глобальный переход, сместив фокус перед при…
11 сен '15 в 14:33
1 ответ

Haskell - хотите глобальную переменную из файла, который не изменяется

type Anagrams = Map String [String] buildAnagrams :: IO Anagrams buildAnagrams = do list <- readCSV "mydict.csv" return $ foldr f Map.empty list where f :: String -> Anagrams -> Anagrams f s = Map.insertWith (++) (sort s) [s] У меня есть эт…
08 дек '14 в 11:33
5 ответов

Ведомственные ограничения против unsafePerformIO

На работе ведутся разговоры о том, чтобы сделать это общеотраслевой политикой, запрещающей использование unsafePerformIO и тому подобное. Лично я не против, потому что всегда утверждал, что если я захочу его использовать, это обычно означает, что мн…