2015-06-16 6 views
6

Wie definiert man neue Berechnungen über Typen von Art GHC.TypeLits.Nat? Ich hoffe, der Lage sein, eine Art Familie, die auf jedem wörtlichen Nat, dann rekursiv mit eingebauten OperationenDefinieren benutzerdefinierter Typfamilien über die Nat-Art

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

so dass WIDTH 0 ~ 0 und WIDTH (n+1) ~ log2 n

+0

Was ist mit 'log2 0'? –

Antwort

5

Wir können Mustererkennung zu definieren.

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