2015-06-20 53 views
2

我有這樣的功能:'試' 可以決定當一個程序暫停

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真的在這裏打破了什麼?

+10

程序可能會進入無限循環,不會返回'()'和'undefined'。那麼你的'isUndefined'函數也會進入一個無限循環,而不會給出任何有意義的結果,因此它不會回答暫停問題。記住暫停問題接收程序(函數,圖靈機,程序,無論)作爲輸入,而不是數據。 – Mephy

+1

你的意思是你通過運行一個程序解決暫停問題,並等待它暫停? – mb14

回答

8

Control.Exception.try是否真的在這裏打破了一切?

unsafePerformIO這裏正在打破的事情。在GHC中,undefined只是引發一個異常,而不是永遠循環(這將是無益的)。異常並不意味着被純粹的(非IO)代碼所捕獲 - 事實上類型系統的確會阻止你嘗試儘可能多的嘗試。

通過使用unsafe*函數,您告訴GHC「忽略所有事情,我知道我在做什麼」,所有安全帶現在都關閉了。幫你一個忙,並假裝unsafe*的東西不存在。

+0

是不安全的*真的應該責怪誰?嘗試可以打印作爲結果是否給予程序停止或不。我認爲例外不應該被發現。 – Brrch

+0

@Brrch異常捕捉只能在IO monad中完成,它在行爲中也可以充當「罪犯」,收集大部分的疣。事實上,異常並不是一個非常優雅的機制,恕我直言,但由於它們的使用僅限於IO monad,它並沒有破壞純粹(無IO)部分中的任何重要屬性。 – chi