You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:54:00