Haskell类型级Nat加减除正常但乘法报错的原因查询
问题成因
Haskell 编译器默认将类型层面的*识别为种类运算符,指代普通值类型所属的种类Type(如Int :: *等价于Int :: Type),而非GHC.TypeLits中定义的类型级自然数乘法运算符。因此当你写1 * 2时,编译器会尝试将种类运算符*作用于类型字面量1(其种类为Nat,并非合法的种类输入),自然触发类型不匹配报错。
解决方案
有两种常用方案可以解决该冲突:
方案1:开启NoStarIsType扩展
该扩展会禁用*作为种类的语法糖,此时*会自动绑定到GHC.TypeLits提供的类型级乘法运算符,直接使用即可:
λ> :set -XDataKinds -XTypeOperators -XNoStarIsType λ> import GHC.TypeLits λ> :k! 1 * 2 1 * 2 :: Nat = 2
方案2:显式调用类型级乘法运算符
如果不想开启额外扩展,可以直接用前缀形式、或带模块限定的形式调用乘法运算符,避开*作为种类运算符的默认解析规则:
λ> :set -XDataKinds -XTypeOperators λ> import GHC.TypeLits λ> :k! (*) 1 2 (*) 1 2 :: Nat = 2 λ> :k! GHC.TypeLits.* 3 4 GHC.TypeLits.* 3 4 :: Nat = 12
内容的提问来源于stack exchange,提问作者mhwombat
相关产品推荐
相关产品推荐

