liquidhaskell-0.8.2.2: tests/pos/Invariants.hs
{-@ LIQUID "--no-termination" @-}
{-@ LIQUID "--short-names" @-}
module Foo () where
import Language.Haskell.Liquid.Prelude (liquidAssert)
import Data.IORef
data Foo a b c d
{-@ data variance IO bivariant @-}
foo :: IO ()
foo = do a <- return 0
liquidAssert (a == 0) (return ())
foo' :: IO ()
foo' = bind (return 0) (\a -> liquidAssert (a == 0) (return ()))
{-@ data variance IORef bivariant @-}
{-@ data variance Foo invariant bivariant covariant contravariant @-}
{-@ job' :: IORef {v:Int | v = 4} -> IO () @-}
job' :: IORef Int -> IO ()
job' p =
bind (readIORef p) (\v -> liquidAssert (v == 4) (return ()))
{-@ bind :: Monad m => m a -> (a -> m b) -> m b @-}
bind :: Monad m => m a -> (a -> m b) -> m b
bind = (>>=)