2015-07-27 3 views
4
:t error 

показывает,Поймите возвращаемого значение функции ошибок Типа

error :: [Char] -> a 

Чтобы понять, что тип а, я написал этот тестовый код,

import Data.Typeable 
custom = error "hello how are you" 

main = do 
    let a = custom 
    putStrLn $ show (typeOf a) 

Он получает возвращаемое значение error функции в и пытается распечатать его, используя функцию show . Он бросает ошибку, как,

ab.hs:6:20: 
    No instance for (Typeable a0) arising from a use of ‘typeOf’ 
    The type variable ‘a0’ is ambiguous 
    Note: there are several potential instances: 
     instance [overlap ok] Typeable() 
     -- Defined in ‘Data.Typeable.Internal’ 
     instance [overlap ok] Typeable Bool 
     -- Defined in ‘Data.Typeable.Internal’ 
     instance [overlap ok] Typeable Char 
     -- Defined in ‘Data.Typeable.Internal’ 
     ...plus 14 others 

Как я могу сделать typeOf для переменной и распечатать его в виде строки?

ответ

2

Вы не можете использовать typeOf с полиморфным выражением, так как это невозможно было бы ввести в Haskell и потому, что нет переменных типа TypeRep. Конечно, последнее было бы достаточно легко исправить, если бы можно было определить typeOf таким образом, чтобы в результате его можно было получить переменную типа, а это не так.

Обратите внимание, что если typeOf может представлять переменные типа и принимать полиморфные аргументы, typeOf (error "") просто напечатает что-то вроде «a» или «forall a. A», поэтому я не уверен, что это вам поможет.

Для того, чтобы использовать typeOf на error, вы должны дать ему мономорфический типа, как этот typeOf (error "" :: String) или typeOf (error "" :: Int), который будет печатать «String» и «Int» соответственно.

+1

'typeOf' и связанный с ним класс' Typeable' пытается сделать * особенно * уверенным, что он может применяться только тогда, когда тип полностью известен, потому что для конверсий 'Typeable' необходимо быть безопасным. Некоторые тонкие лазейки в этом были закрыты в недавних GHC. –

4

a - нижний регистр, что означает, что это переменная типа. Он может принимать любой тип. Вы можете подставить результат error для любого выражения, и ваш код будет вводить проверку. Это полезно для частичных функций, которые не определены для всех возможных аргументов. Например:

head :: [a] -> a 
head [] = error "empty list" 
head (x:_) = x 

Учитывая пустой список, вы не можете создать первый элемент, потому что его не существует. error заставляет типы работать, но взрывается во время выполнения при оценке.

Per user5402's comment ниже:

error "add" может иметь любой тип в части, потому что он никогда не возвращается.

+2

Возможно, было бы полезно указать, что 'error" add "' может иметь какой-либо тип, потому что он никогда не возвращается. То же самое можно сказать и о бесконечном цикле 'foo = foo', который также определяется как« undefined ». – ErikR

+2

Я думаю, что стандарт позволяет это быть, ну, не определено, но в базе GHC 'undefined' [определяется как] (https://downloads.haskell.org/~ghc/latest/docs/html/libraries/ base/src/GHC-Err.html # undefined) 'undefined = ошибка" Prelude.undefined "'. – Lynn

Смежные вопросы