"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*
материал не существует