haskell - 在 Nat 类型上定义自定义类型系列

标签 haskell type-level-computation data-kinds

如何定义一种类型的新计算 GHC.TypeLits.Nat ?我希望能够定义一个类型族

type family WIDTH (n :: Nat) :: Nat

这样WIDTH 0 ~ 0WIDTH (n+1) ~ log2 n

最佳答案

我们可以对任何文字进行模式匹配 Nat ,然后使用内置操作进行递归。

{-# LANGUAGE UndecidableInstances #-}

import GHC.TypeLits

type family Div2 n where
  Div2 0 = 0
  Div2 1 = 0
  Div2 n = Div2 (n - 2) + 1

type family Log2 n where
  Log2 0 = 0  -- there has to be a case, else we get nontermination
              -- or we could return Maybe Nat
  Log2 1 = 0
  Log2 n = Log2 (Div2 n) + 1

type family WIDTH n where
  WIDTH 0 = 0
  WIDTH n = Log2 (n - 1)

关于haskell - 在 Nat 类型上定义自定义类型系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866612/

相关文章:

haskell - 捕获 `error` 引发的错误?

haskell - GHC 7.8 中类型级别自然的行为

haskell - 使用 `Proxy s` 绑定(bind)类型与使用 forall 绑定(bind)类型

haskell - 有懒人mapM吗?

haskell - 部分应用的中缀运算符的困惑

haskell - 在没有 `Conkin.Traversable` 的情况下将值更改为 `unsafeCoerce` 中的索引

haskell - 在 Haskell 的类型级编程中使用类型不等式

haskell - 使用数据种类对函数类型的约束

list - 一口气解压?

typescript - 标记元组的类型级操作