lazy-lambda-calculus: a887acf68941d8b2d99be2c4787022e75a5383b3

     1: {-# Language DeriveDataTypeable         #-}
     2: 
     3: module Data.Nat where
     4: 
     5: import Data.Data
     6: import Data.Typeable
     7: import Test.LazySmallCheck2012 hiding (Nat, Term, Const)
     8: import Test.LazySmallCheck2012.Core hiding (Term)
     9: 
    10: -- Peano-style natural numbers
    11: data Nat = Z
    12:          | S Nat
    13:            deriving (Eq, Typeable, Data)
    14: 
    15: instance Ord Nat where
    16:   (<=)  Z     Z    = True
    17:   (<=)  Z    (S _) = True
    18:   (<=) (S x)  Z    = False
    19:   (<=) (S x) (S y) = x <= y
    20: 
    21: natToInteger :: Nat -> Integer
    22: natToInteger Z = 0
    23: natToInteger x = let f n  Z    = n
    24:                      f n (S x) = f (n+1) x in
    25:                  f 0 x
    26: 
    27: natToInt :: Nat -> Int
    28: natToInt = fromInteger . natToInteger
    29: 
    30: instance Show Nat where
    31:   show = show . natToInteger
    32: 
    33: instance Num Nat where
    34:   x + y = fromInteger (natToInteger x + natToInteger y)
    35:   x * y = fromInteger (natToInteger x * natToInteger y)
    36: 
    37:   (-) x      Z    = x
    38:   (-) (S x) (S y) = x - y
    39:   (-) Z      _    = error "Subtraction was truncated"
    40: 
    41:   negate = error "Cannot negate a Nat"
    42: 
    43:   abs = id
    44: 
    45:   signum  Z    = Z
    46:   signum (S _) = S Z
    47: 
    48:   fromInteger = let f 0 = Z
    49:                     f n = S (f (n - 1)) in
    50:                 f . abs
    51: 
    52: instance Real Nat where
    53:   toRational = toRational . toInteger
    54: 
    55: instance Integral Nat where
    56:   quotRem x y = let x' = toInteger x'
    57:                     y' = toInteger y'
    58:                     (q, r) = quotRem x' y' in
    59:                 (fromInteger q, fromInteger r)
    60:   toInteger = toInteger . natToInt
    61: 
    62: instance Enum Nat where
    63:   toEnum   = fromInteger . fromIntegral
    64:   fromEnum = natToInt
    65: 
    66: instance Serial Nat where
    67:   series = cons0 Z \/
    68:            cons1 S
    69: 
    70: lookUp :: [a] -> Nat -> Maybe a
    71: lookUp []      _    = Nothing
    72: lookUp (x:xs)  Z    = Just x
    73: lookUp (x:xs) (S n) = lookUp xs n

Generated by git2html.