haskell - 只有一个值可提升到种类级别的数据类型

标签 haskell type-families data-kinds

我知道我可以将 Bool 提升到这样的级别,其中 Bool 可能是 TrueFalse:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

type family TF t :: Bool
type instance TF Int = True
type instance TF Bool = False

我想改为提升 (),它当然只有一个值 ()。但这似乎不起作用:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

type family TF t :: ()
type instance TF Int = ()
type instance TF Bool = ()

我想我可以只使用 BoolTrue,但是有没有可以提升到 kind 级别的单值类型?

最佳答案

尝试使用 '()而不是 ()在类型级别:

type family ToNull t :: ()
type instance ToNull Int = '()
type instance ToNull Bool = '()

还有 TrueFalse实际上是 'True 的简写和 'False在类型级别。

问题是有四个 ()在范围内:

  1. 普通型()实物*
  2. 1 的唯一构造函数,也是 ()
  3. 种类()从 1 晋升
  4. 类型'()实物()从 2 提升而来,它具有类型同义词 ()默认

没有有时可选的单引号,1 和 4 是不明确的。

详情可以查看GHC的使用指南:7.9. Datatype promotion

关于haskell - 只有一个值可提升到种类级别的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682969/

相关文章:

haskell - 用 GHC 类型级文字替换自建 Naturals

haskell - 反转类型族

haskell - 如何为递归单例类型定义 NFData 实例?

haskell - Haskell 的 DataKinds 扩展是什么?

haskell - 涉及种类 `Nat` 的乘法问题

haskell - @(_ :_), 它在模式匹配中是如何工作的

java - 从Java调用Haskell,动态链接错误重定位

haskell - 如何获得更简单但等效的 Haskell 表达式版本

haskell - 在类型族中编写多态函数

haskell - 如何使用单例库中的 toSing?