"try" может решить, когда программа остановится

У меня есть эта функция:

isUndefined :: () -> Bool    
isUndefined x = case unsafePerformIO $ (try (return $! x) :: IO (Either SomeException ())) of
                    Left _ -> True
                    Right _ -> False

затем:

isUndefined () = False
isUndefined undefined = True

Решение проблемы остановки. Конечно, это может быть распространено и на другие типы.

Мой вопрос: как это возможно? Является Control.Exception.try действительно ломать вещи здесь?

1 ответ

Решение

Control.Exception.try действительно ломает вещи здесь?

unsafePerformIO ломает вещи здесь. В GHC, undefined просто вызывает исключение, а не цикл навсегда (что было бы бесполезно). Исключения не предназначены для захвата в чистом (не-IO) коде - на самом деле система типов действительно препятствует тому, чтобы вы пытались делать столько же.

Используя unsafe* функции, вы говорите GHC "игнорировать все, я знаю, что я делаю", и все ремни безопасности теперь отключены. Сделай себе одолжение и сделай вид, что unsafe* материал не существует

Другие вопросы по тегам