为什么Char类型不存在类似Num的`Char a => a`多态字面量形式?
类型签名差异原因解答
核心原因是Haskell中两类字面量的多态属性、以及类型类和具体类型的本质差异:
- 数字字面量是天然多态的:
1、2这类数值没有固定类型,它可以是Int、Integer、Float等任意实现了Num类型类的类型。当你定义a = (1, 2)时,两个元素的类型都没有被固化,因此类型签名需要带上(Num a, Num b)的约束,声明两个元素的类型分别是满足Num约束的a和b,最终签名就是a :: (Num a, Num b) => (a, b)。 - Char字面量是单态的:
'a'、'b'这类字符字面量的类型是固定的具体类型Char,不存在其他可兼容的类型,也不存在名为Char的类型类——Char本身就是基础的具体类型,不是可以用来约束多态类型的类型类。因此定义b = ('a', 'b')时,两个元素的类型都是确定的Char,类型签名直接就是b :: (Char, Char)。
额外补充:你设想的b :: (Char a, Char b) => (a, b)形式在Haskell中不可能成立,因为只有类型类可以出现在类型约束的位置,Char作为具体类型没有资格作为约束使用,而Num是标准的数值类型类,天然可以用来约束多态类型变量。
内容的提问来源于stack exchange,提问作者QuantumUser98
相关产品推荐
相关产品推荐

