liquidhaskell-0.7.0.0: tests/todo/TypeError.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-@ LIQUID "--autoproofs" @-}
{-@ LIQUID "--totality" @-}
{-@ LIQUID "--exact-data-cons" @-}
module Append where
import Axiomatize
import Equational
import Prelude hiding (return, (>>=))
data L a = N
-- | Definition of the list monad
{-@ axiomatize return @-}
$(axiomatize
[d| return :: a -> L a
return x = N
|])
{-@ axiomatize append @-}
$(axiomatize
[d| append :: L a -> L a -> L a
append N ys = ys
|])
{-@ axiomatize bind @-}
$(axiomatize
[d| bind :: L a -> (a -> L a) -> L a
bind N f = N
|])
-- | Right Identity m >>= return ≡ m
{-@ prop_right_identity :: Eq a => L a -> {v:Proof | bind N return == N } @-}
prop_right_identity :: Eq a => L a -> Proof
prop_right_identity N = refl (bind N return) `by` pr1
where
e1 = bind N return
pr1 = axiom_bind_N return
e2 = N
-- | List definition
instance Eq a => Eq (L a) where
N == N = True
{-@ data L [llen] @-}
{-@ invariant {v: L a | llen v >= 0} @-}
{-@ measure llen @-}
llen :: L a -> Int
llen N = 0