为何显式指定`Product Int`类型对任意`Num`类型均生效?
为什么显式指定
Product Int类型对Num字面量生效? - Haskell里的数字字面量
4不是固定类型,它的类型是Num a => a——本质是fromInteger 4的语法糖,只要目标类型实现了Num类型类,这个字面量就能被转换成该类型的实例。 Product是Data.Monoid中的newtype包装器,定义为newtype Product a = Product a,用来把类型的乘法操作适配成Monoid的mappend(对应乘法*)和mempty(对应单位元1)。- 核心原因是:只要
Product内部包裹的类型(这里是Int)实现了Num,Haskell就会自动为Product Int推导Num实例。这意味着Product Int完全符合Num类型类的要求,能接收4这样的Num字面量。 - 实际编译时,
4 :: Product Int会被转换成Product 4,也就是用Product构造器把Int类型的4包装起来。
举个直观的等价写法:
import Data.Monoid -- 两种写法完全等价 x = 4 :: Product Int y = Product 4
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

