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

Cac*_*tus 6 haskell type-level-computation data-kinds

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

type family WIDTH (n :: Nat) :: Nat
Run Code Online (Sandbox Code Playgroud)

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

And*_*ács 5

我们可以在任何文字上进行模式匹配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)
Run Code Online (Sandbox Code Playgroud)