涉及种类`Nat`的乘法问题
Multiplication problem involving kind `Nat`
为什么 Nat
的加法、减法和除法有效,但乘法无效?
λ> :set -XDataKinds
λ> :set -XTypeOperators
λ> import GHC.TypeLits
λ> :k! 1 + 2
1 + 2 :: Nat
= 3
λ> :k! 1 - 2
1 - 2 :: Nat
= 1 - 2
λ> :k! 5 `Div` 2
5 `Div` 2 :: Nat
= 2
λ> :k! 1 * 2
<interactive>:1:1: error:
• Expected kind ‘* -> Nat -> k0’, but ‘1’ has kind ‘Nat’
• In the type ‘1 * 2’
*
用于指定一个简单的 Type
。结果,1
被视为第一个类型参数 a *
(因此 Type
)和第二个类型参数 2
,因此 1
应该有种类 * -> Nat -> <em>something</em>
。如果 StarIsType
extension 启用,GHC 将解析星号 (*
) 作为对 Type
的引用,这是默认设置。
如果禁用它,则星号 (*
) 将指代乘法,例如:
Prelude> :set -XDataKinds
Prelude> :set -XTypeOperators
Prelude> :set -XNoStarIsType
Prelude> import GHC.TypeLits
Prelude GHC.TypeLits> :k 1 * 2
1 * 2 :: Nat
Prelude GHC.TypeLits> :kind! 1 * 2
1 * 2 :: Nat
= 2
您还可以明确指定您使用 *
类型系列 family from with:
的模块
Prelude> :set -XDataKinds
Prelude> :set -XTypeOperators
Prelude> import GHC.TypeLits
Prelude GHC.TypeLits> :k 1 GHC.TypeLits.* 2
1 GHC.TypeLits.* 2 :: Nat
Prelude GHC.TypeLits> :kind! 1 GHC.TypeLits.* 2
1 GHC.TypeLits.* 2 :: Nat
= 2
为什么 Nat
的加法、减法和除法有效,但乘法无效?
λ> :set -XDataKinds
λ> :set -XTypeOperators
λ> import GHC.TypeLits
λ> :k! 1 + 2
1 + 2 :: Nat
= 3
λ> :k! 1 - 2
1 - 2 :: Nat
= 1 - 2
λ> :k! 5 `Div` 2
5 `Div` 2 :: Nat
= 2
λ> :k! 1 * 2
<interactive>:1:1: error:
• Expected kind ‘* -> Nat -> k0’, but ‘1’ has kind ‘Nat’
• In the type ‘1 * 2’
*
用于指定一个简单的 Type
。结果,1
被视为第一个类型参数 a *
(因此 Type
)和第二个类型参数 2
,因此 1
应该有种类 * -> Nat -> <em>something</em>
。如果 StarIsType
extension 启用,GHC 将解析星号 (*
) 作为对 Type
的引用,这是默认设置。
如果禁用它,则星号 (*
) 将指代乘法,例如:
Prelude> :set -XDataKinds
Prelude> :set -XTypeOperators
Prelude> :set -XNoStarIsType
Prelude> import GHC.TypeLits
Prelude GHC.TypeLits> :k 1 * 2
1 * 2 :: Nat
Prelude GHC.TypeLits> :kind! 1 * 2
1 * 2 :: Nat
= 2
您还可以明确指定您使用 *
类型系列 family from with:
Prelude> :set -XDataKinds
Prelude> :set -XTypeOperators
Prelude> import GHC.TypeLits
Prelude GHC.TypeLits> :k 1 GHC.TypeLits.* 2
1 GHC.TypeLits.* 2 :: Nat
Prelude GHC.TypeLits> :kind! 1 GHC.TypeLits.* 2
1 GHC.TypeLits.* 2 :: Nat
= 2