回答
按照Haskell 2010 report, chapter 9,評估undefined
應該總是導致錯誤:
-- It is expected that compilers will recognize this and insert error
-- messages that are more appropriate to the context in which undefined
-- appears.
undefined :: a
undefined = error "Prelude.undefined"
由於打印值包括評價它,這總是會給出一個錯誤。
然而,傳遞給'print'並不一定要評估它,這取決於'Show'實例 – newacct
即使(如別人已經指出的那樣),你不能爲undefined
指定Show
例如,您可以通過使用catch
如下面的代碼放在一起解決方法:
import qualified Control.Exception as C
import System.IO.Unsafe (unsafePerformIO)
showCatch :: (Show a) => a -> IO String
showCatch = showCatch' "undefined"
showCatch' :: (Show a) => String -> a -> IO String
showCatch' undef x = C.catch (C.evaluate (show x)) showUndefined
where
showUndefined :: C.ErrorCall -> IO String
showUndefined _ = return undef
unsafeShowCatch :: (Show a) => a -> String
unsafeShowCatch x = unsafePerformIO (showCatch x)
但這個例子只會簡單表達式的工作:
*Main> let v1 = showCatch 1
v1 :: IO String
*Main> let v2 = showCatch $ if True then undefined else 0
v2 :: IO String
*Main> v1
"1"
*Main> v2
"undefined"
*Main> let v3 = unsafeShowCatch 1
v3 :: String
*Main> let v4 = unsafeShowCatch $ undefined
v4 :: String
*Main> v3
"1"
*Main> v4
"undefined"
它不會像
呼叫工作我不知道爲什麼,但GHCI的'+ t'選項告訴'showCatch 1'有String類型,但它實際上是'IO String'。我將它固定在答案中。 –
底部值(其中undefined
是一種風味)是一個永遠不會構建的值,因此無法觀察到。這意味着你無法打印它。這個值不能與其他語言的null
進行比較,通常可以觀察到,甚至檢查。
將undefined
以及error "blah"
和其他所有底部等效爲無限循環的結果很有用。無限循環的結果從來沒有構建過,因此無法觀察。
理論上這是真的,但實際上我正在打印它,看到我的答案:) –
很好的回答,歡迎來到SO! – Ashe
更概念上:「未定義」不是像'X'這樣的值。 'X'值的類型爲Char。 「undefined」有哪些類型?符號「未定義」是多態的,它可以有任何類型(任何類型*)。
類型類,如類型t中的「顯示t」調度。所以不同的類型可以有不同的顯示功能。哪個函數得到你的「未定義」取決於類型。
在GHCI中,大多數多態類型默認爲(),因此它可以運行該命令。一個可以使顯示功能的一個新類型,不看價值:
Prelude> data Test = Test
Prelude> instance Show Test where show x = "I did not look at x"
Prelude> show Test
"I did not look at x"
Prelude> show (undefined :: Test)
"I did not look at x"
但是你可以看到這個由從未檢查價值可言避免與不確定的錯誤。所以這有點無用。
你可以做你自己的類型類,印刷機械,在IO運行,並捕獲錯誤,並做那種你想要什麼:
import Control.Exception
perr s = do x <- try (evaluate (show s)) :: IO (Either SomeException String)
return (either show id x))
以上翻譯錯誤到錯誤的字符串形式:
Prelude Control.Exception> perr True
"True"
Prelude Control.Exception> perr (undefined :: Bool)
"Prelude.undefined"
注意:更好的'perr'需要強制整個字符串而不是WHNF。
- 1. JLabel實例未顯示
- 2. 'a ++&f(a)`未定義或未指定?
- 3. 通過Yesod's Key定義新實例a?
- 4. Haskell:顯示實例歧義
- 5. TypeError:t.validator.methods [a]未定義?
- 6. 未實例化的自定義事件
- 7. jQuery:未定義顯示
- 8. req.target顯示未定義 - sails.js
- 9. 自定義擴展顯示不出來實驗實例中
- 10. 如何爲一個特定的「a」實例定義CSS?
- 11. AWS ECS firstRun未顯示EC2實例
- 12. NameError:未定義名稱'A'
- 13. 的WordPress:對象實例中的functions.php定義顯示NULL在footer.php
- 14. 即使使用模型實例實例化Django窗體顯示爲未綁定
- 15. 自定義UserDetails實現的示例
- 16. 爲什麼實例變量未定義?
- 17. bootstrap-wysiwyg獲取實例未定義
- 18. Angular $ resource新實例未定義
- 19. CKEditor編輯器實例.lang未定義?
- 20. 無法顯示2個實例我自定義的SurfaceView
- 21. 本地存儲實現顯示未定義的值
- 22. JLayeredPane未顯示我的自定義JPanel
- 23. AutoCompleteTextView上的自定義ArrayAdapter未顯示
- 24. 自定義UITableViewCell的內容未顯示
- 25. JSON JavaScript的顯示值未定義
- 26. $ error顯示爲未定義的變量
- 27. 顯示爲未定義的PHP URI值
- 28. jqTree顯示未定義有效的JSON
- 29. Chrome顯示未定義的keyCode
- 30. knockout js observable顯示未定義的值
您只能爲_types_創建實例。 'undefined'是一個_value_,它沒有特別的類型,它只是Bottom--它可以有任何類型。 – leftaroundabout
我同意@leftaroundabout,我沒有看到實現這一目標的可能性。 –
你的用例是什麼?如果你的意思是捕捉異常,那可以完成,但不應該在Show實例中完成。 –