background
所示,
: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
并以字符串形式打印?
答案 0 :(得分:4)
a
是小写,这意味着它是一个类型变量。它可以采用任何类型。您可以将error
的结果替换为任何表达式,您的代码将键入check。这对于未为所有可能的参数定义的部分函数很有用。例如:
head :: [a] -> a
head [] = error "empty list"
head (x:_) = x
给定一个空列表,您实际上不能生成第一个元素,因为它不存在。 error
使类型变得有效,但在评估时会在运行时爆炸。
error "add"
部分可以有任何类型,因为它永远不会返回。
答案 1 :(得分:2)
你不能将typeOf
与多态表达式一起使用,因为在Haskell中输入是不可能的,因为没有TypeRep
表示类型变量。当然后者很容易修复,如果有可能以一种可能产生类型变量的方式来定义typeOf
,而不是。{/ p>
请注意,如果typeOf
可以表示类型变量并接受多态参数,typeOf (error "")
只会打印类似“a”或“forall a.a”的内容,所以我不确定那会是帮助你。
要在typeOf
上使用error
,您必须为其提供一个单态类型,例如typeOf (error "" :: String)
或typeOf (error "" :: Int)
,它将打印“字符串”和分别是“Int”。