了解错误功能的返回值类型

时间:2015-07-27 06:53:14

标签: haskell

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 并以字符串形式打印?

2 个答案:

答案 0 :(得分:4)

a是小写,这意味着它是一个类型变量。它可以采用任何类型。您可以将error的结果替换为任何表达式,您的代码将键入check。这对于未为所有可能的参数定义的部分函数很有用。例如:

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

给定一个空列表,您实际上不能生成第一个元素,因为它不存在。 error使类型变得有效,但在评估时会在运行时爆炸。

以下user5402's comment

  

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”。