Блог пользователя nagibator

Автор nagibator, 8 лет назад, перевод, По-русски

Я люблю 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 считается небезопасной?

  • Проголосовать: нравится
  • +31
  • Проголосовать: не нравится

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

Судя по всему, в версии 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 можно было творить что-то аналогичное. В доках, правда, разницы нет. Возможно, это был какие-то технические ограничения.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Большое спасибо! О Safe Haskell почти ничего не слышал, пошел в гугл. Надеюсь, версию платформы обновят, чтобы подобных проблем не возникало. Удивительно, что если есть Safe-версия, ее не сделали версией по умолчанию сразу, ведь логичнее явно указывать, что код Unsafe вместо того, чтобы говорить "ну вообще-то этот код еще и безопасный"

»
8 лет назад, # |
  Проголосовать: нравится -13 Проголосовать: не нравится

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.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

'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.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    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.