Я люблю Haskell и время от времени решаю задачи на этом языке, но до этого как-то получалось так, что я выбирал задачи, в которых обходился без монады ST. Сегодня я попробовал решить 686D - Кай и снежинки и мне понадобилась монада ST, чтобы представить граф в виде списков смежности вместо списка родительских вершин. Конечно же, все, что я сделал, работало нормально на моем компьютере, но когда я попытался отправить решение на проверку, CF сказал, что у меня ошибка компиляции:
Can't compile file:
program.hs:2:1:
Control.Monad.ST: Can't be safely imported!
The module itself isn't safe.
program.hs:3:1:
Data.Array.ST: Can't be safely imported!
The module itself isn't safe.
Вот та самая попытка: 18723133
Что нужно сделать, чтобы оно заработало? Как пользоваться ST или чем-то аналогичным? Почему ST считается небезопасной?
Судя по всему, в версии Haskell Platform 7.8.3, которая лежит на CF, модуль
Control.Monad.ST
был "unsafe" (доки). Зато был модульControl.Monad.ST.Safe
(доки) и аналогичный для массивов, который можно использовать (18726450). В новых версиях они deprecated.Увы, совсем не знаком с Safe Haskell, поэтому не могу ответить на вопросы "почему так". Вроде бы Safe Haskell — это что-то про ограничение типов функций (например, нет unsafe ввода-вывода
:: IO a -> a
), вероятно, раньше вST
можно было творить что-то аналогичное. В доках, правда, разницы нет. Возможно, это был какие-то технические ограничения.Большое спасибо! О Safe Haskell почти ничего не слышал, пошел в гугл. Надеюсь, версию платформы обновят, чтобы подобных проблем не возникало. Удивительно, что если есть Safe-версия, ее не сделали версией по умолчанию сразу, ведь логичнее явно указывать, что код Unsafe вместо того, чтобы говорить "ну вообще-то этот код еще и безопасный"
This is Haskell's safety, your program can't possibly go wrong if it doesn't compile in the first place. Therefore working as intended.
'Safe' here refers to type safety. If you compile with flag
-XSafe
, certain modules that subvert type system are disallowed. But also, this flag disallows Template Haskell which provides the ability to execute arbitrary code at compile time. Maybe that's why at a certain point Mike enabled this flag.By the way, apparently there is ghc option
-trust
that allows marking certain packages as trusted. If we add-XSafe -trust base
to the compilation command, Template Haskell will be disallowed but all modules in base (like Control.Monad.ST) will be allowed.