Am Dienstag, 19. Februar 2008 21:44 schrieben Sie:
> * Support of type-level Booleans (Wolfgang?)

Attached is just a quickly hacked Boolean module.  Nothing very special.  I’d 
be happy if you could prettify this (choose better names, add documentation, 
etc.).  Thanks for any effort.

Best wishes,
Wolfgang
{-# LANGUAGE EmptyDataDecls, MultiParamTypeClasses, FunctionalDependencies #-}
module Data.TypeLevel.Boolean (

    -- * Data
    False,
    false,
    True,
    true,

    -- * Operations
    And (and),
    Or (or),
    Xor (xor),
    Imp (imp),
    Equ (equ)

) where

    -- * Data
    class Boolean boolean

    data False

    instance Boolean False

    false :: False
    false = undefined

    data True

    instance Boolean True

    true :: True
    true = undefined

    -- * Operations
    class (Boolean boolean, Boolean boolean') =>
          Not boolean boolean' | boolean -> boolean', boolean' -> boolean where

        not :: boolean -> boolean'

    instance Not False True where

        not _ = true

    instance Not True False where

        not _ = false

    class (Boolean boolean1, Boolean boolean2, Boolean boolean') =>
          And boolean1 boolean2 boolean' | boolean1 boolean2 -> boolean' where

        and :: boolean1 -> boolean2 -> boolean'

    instance And False False False where

        and _ _ = false

    instance And False True False where

        and _ _ = false

    instance And True False False where

        and _ _ = false

    instance And True True True where

        and _ _ = true

    class (Boolean boolean1, Boolean boolean2, Boolean boolean') =>
          Or boolean1 boolean2 boolean' | boolean1 boolean2 -> boolean' where

        or :: boolean1 -> boolean2 -> boolean'

    instance Or False False False where

        or _ _ = false

    instance Or False True True where

        or _ _ = true

    instance Or True False True where

        or _ _ = true

    instance Or True True True where

        or _ _ = true

    class (Boolean boolean1, Boolean boolean2, Boolean boolean') =>
          Xor boolean1 boolean2 boolean' | boolean1 boolean2 -> boolean',
                                           boolean1 boolean' -> boolean2,
                                           boolean2 boolean' -> boolean1 where

        xor :: boolean1 -> boolean2 -> boolean'

    instance Xor False False False where

        xor _ _ = false

    instance Xor False True True where

        xor _ _ = true

    instance Xor True False True where

        xor _ _ = true

    instance Xor True True False where

        xor _ _ = false

    class (Boolean boolean1, Boolean boolean2, Boolean boolean') =>
          Imp boolean1 boolean2 boolean' | boolean1 boolean2 -> boolean' where

        imp :: boolean1 -> boolean2 -> boolean'

    instance Imp False False True where

        imp _ _ = true

    instance Imp False True True where

        imp _ _ = true

    instance Imp True False False where

        imp _ _ = false

    instance Imp True True True where

        imp _ _ = true

    class (Boolean boolean1, Boolean boolean2, Boolean boolean') =>
          Equ boolean1 boolean2 boolean' | boolean1 boolean2 -> boolean',
                                           boolean1 boolean' -> boolean2,
                                           boolean2 boolean' -> boolean1 where

        equ :: boolean1 -> boolean2 -> boolean'

    instance Equ False False True where

        equ _ _ = true

    instance Equ False True False where

        equ _ _ = false

    instance Equ True False False where

        equ _ _ = false

    instance Equ True True True where

        equ _ _ = true

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to