haskell - 在 Nat 上使用 * 作为原语

标签 haskell ghc ghci data-kinds

我目前正在查看 Sandy Maguire 的 Thinking with Types ,第 2 章涵盖术语、类型和种类。其中,有一个与类型级原语进行简单交互的示例,用于在 Nat 上执行算术运算。 s。

以下 session 显示在本书中有效,但在我的机器上失败:

Prelude> import GHC.TypeLits
Prelude GHC.TypeLits> :set -XDataKinds
Prelude GHC.TypeLits> :set -XTypeOperators
Prelude GHC.TypeLits> :kind! (1 + 17) * 3

<interactive>:1:1: error:
    * Expected kind `* -> Nat -> k0', but `1 + 17' has kind `Nat'
    * In the type `(1 + 17) * 3'

但是,本书中的下一个示例有效:
Prelude GHC.TypeLits> :kind! (128 `Div` 8) ^ 2
(128 `Div` 8) ^ 2 :: Nat
= 256

我怀疑这个问题与 * 有关也表示一种。 Sandy Maguire 写道,这种语法将被弃用,但如果它仍然存在,我可以看到 GHCi 认为我的意思是那种 *而不是类型级函数* .

我是否走在正确的轨道上,如果是这样,是否有一些标志可以用来使示例正常工作?

最佳答案

I suspect the problem has something to do with * also indicates a kind.



是的,这就是问题所在。可以使用 -XNoStarIsType 来解决扩展,让您对待 *作为另一个类型运算符。

指以前称为 * 的那种您可以导入 Type表格 Data.Kind .例如,Maybe 的种类是 Type -> TypeStateT 的那种是 Type -> (Type -> Type) -> Type -> Type .

希望在 future 的某个时刻-XNoStarIsType将成为默认值,我们将始终使用 Type .

关于haskell - 在 Nat 上使用 * 作为原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61745506/

相关文章:

haskell - 如何在 GHC 中仅为旧版本定义功能?

haskell - Haskell 中 (^) 的奇怪行为

exception - Haskell 中的纯异常

haskell - 哪些程序可以简单地指定为依赖类型,但实现起来很复杂?

haskell - 使用 ghc 编译 Haskell 代码时出现特化警告

haskell - 类的 ghci 意外行为实例

Haskells 弱头范式

haskell - 如果 `zip` 是合法类型类的方法,那么是哪个?

haskell - 为什么 Haskell 会(显然)不一致地推断出特定类型?

haskell - tinfo6 代表什么?