2015-06-20 9 views
2

У меня есть эта функция:'попытка' может решить, когда программа останавливается

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

затем:

isUndefined() = False 
isUndefined undefined = True 

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

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

+10

Программа может вводить бесконечный цикл, не возвращая ни '()', ни 'undefined'. Тогда ваша функция isUndefined также вводит бесконечный цикл, не давая никакого значимого результата, поэтому он не отвечает на проблему с остановкой. Помните, что проблема с остановкой получает в качестве входных данных программу (функцию, машину Тьюринга, процедуру, что угодно), а не данные. – Mephy

+1

Вы имеете в виду, что решаете проблему остановки, запустив программу и дождавшись ее остановки? – mb14

ответ

8

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

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

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

+0

Небезопасный * действительно тот, кто виноват? Попробуйте распечатать в результате, будет ли программа остановлена ​​или нет. Я думал, что исключения не должны быть пойманы вообще. – Brrch

+0

@Brrch Исключение ловли может быть сделано только в монаде IO, которое в действиях также действует как «грех-бин», собирая большую часть бородавок. Действительно, исключения не являются ужасно изящным механизмом, IMHO, но поскольку их использование ограничено монадой IO, оно не нарушает каких-либо важных свойств в чистой (без IO) части. – chi