Haskell中Num类型的延迟解析:partialSum=sum 1时1的存储形式探究
Haskell中延迟类型推断下多态值的存储形式
首先咱们先看你给出的代码示例:
let sum::Num a=> a->a->a; sum a b = a +b
let partialSum = sum 1
partialSum 2.0 3.0
你问到执行let partialSum = sum 1时,1是以什么形式存在内存里的——答案是:它并没有被固定成Integer或者任何具体数值类型,而是作为一个带类型约束的多态值存储的。
这里得拆解几个关键点:
- 首先,Haskell里的
1本身就是多态的,它的类型是Num a => a,不是默认的Integer(只是在没有其他类型提示时,GHCI会默认用Integer显示,但本质还是多态的)。 - 当你把
1传给sum(类型是Num a => a -> a -> a),得到的partialSum类型是Num a => a -> a——你可以在GHCI里敲:t partialSum验证这一点,它会明确显示这个多态类型。 - 在GHCI存储这个值的时候,它会保留这个多态性,同时附带
Num类型类的"字典"信息(这个字典里包含了对应类型的+、fromInteger等方法实现)。此时1是一个"未具体化"的抽象值,并没有转换成具体的机器表示(比如整数字节或浮点格式)。
直到你调用partialSum 2.0的时候,传入的2.0是Double类型,Haskell才会根据这个类型确定Num的具体实例(也就是Double的Num实现),此时才会把之前的多态1转换成Double类型的1.0,再参与后续的加法计算——这也就能解释为什么最终结果是Fractional类型的3.0了。
简单来说,Haskell的延迟类型推断和多态值机制会让这类值保持"抽象"状态,直到必须生成具体计算结果时,才会绑定到具体类型并转换成对应的机器存储形式。
内容的提问来源于stack exchange,提问作者coder_bro
相关产品推荐
相关产品推荐

