2015-06-16 20 views

risposta

5

possiamo abbinare modello su qualsiasi letterale Nat, quindi ricorsivamente utilizzando le operazioni incorporati.

{-# 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)