liquidhaskell-0.4.0.0: tests/neg/LiquidClass1.hs
module LiquidClass where
-- | Typing classes
-- | Step 1: Refine type dictionaries:
class Compare a where
cmax :: a -> a -> a
cmin :: a -> a -> a
instance Compare Int where
{-@ instance Compare Int where
cmax :: Odd -> Odd -> Odd ;
cmin :: Int -> Int -> Odd
@-}
cmax y x = if x >= y then x else y
cmin y x = if x >= y then x else y
-- | creates dictionary environment:
-- | * add the following environment
-- | dictionary $fCompareInt :: Compare Int
-- | { $ccmax :: Odd -> Odd -> Odd
-- | , $ccmin :: Int -> Int -> Int
-- | }
-- |
-- | Important: do not type dictionaries, as preconditions
-- | of fields cannot be satisfied!!!!!
-- | Dictionary application
-- | ((cmax Int) @fcompareInt) :: Odd -> Odd -> Odd
-- | ((cmin Int) @fcompareInt) :: Int -> Int -> Int
-- | (anything_else @fcompareInt) :: default
{-@ foo :: Odd -> Odd -> Odd @-}
foo :: Int -> Int -> Int
foo x y = cmax x y