为什么返回String不算作Showx类型的表达式?
谁能帮我理解为什么这段代码会产生编译错误?
hello :: (Show x) => x
hello = "Hello"
我以为String
有了 的属性Show
,那么函数应该可以返回一个String
? 这是错误消息:
hello :: (Show x) => x
hello = "Hello"
回答
你的类型签名并不意味着你认为它意味着什么。
从你的解释来看,你似乎读到了类似“我将返回一个x
具有 实例的某种类型的值Show
。我不会告诉你它到底是什么类型,但我保证它将有一个Show
“
但它真正的意思是“选择一个类型,任何类型,只要确保它有一个 的实例Show
,我保证我会返回一个该类型的值”
换句话说,当一个函数是泛型时,选择泛型类型的是函数的调用者,而不是实现者。