Rattus-0.5: test/IllTyped.hs
{-# LANGUAGE Arrows #-}
{-# LANGUAGE RebindableSyntax #-}
module Main (module Main) where
import Rattus
import Rattus.Stream as S
import Rattus.Yampa
import Prelude
import Rattus.Plugin.Annotation (InternalAnn (..))
{-# ANN module Rattus #-}
{-# ANN loopIndirect ExpectError #-}
loopIndirect :: Str Int
loopIndirect = run
where run :: Str Int
run = loopIndirect
{-# ANN loopIndirect' ExpectError #-}
loopIndirect' :: Str Int
loopIndirect' = let run = loopIndirect' in run
{-# ANN nestedUnguard ExpectError #-}
nestedUnguard :: Str Int
nestedUnguard = run 0
where run :: Int -> Str Int
run 0 = nestedUnguard
run n = n ::: delay (run (n-1))
{-# ANN sfLeak ExpectError #-}
sfLeak :: O Int -> SF () (O Int)
sfLeak x = proc _ -> do
returnA -< x
{-# ANN advDelay ExpectError #-}
advDelay :: O (O a) -> O a
advDelay y = delay (let x = adv y in adv x)
{-# ANN advDelay' ExpectError #-}
advDelay' :: O a -> a
advDelay' y = let x = adv y in x
{-# ANN dblAdv ExpectError #-}
dblAdv :: O (O a) -> O a
dblAdv y = delay (adv (adv y))
{-# ANN advScope ExpectError #-}
advScope :: O (O Int -> Int)
advScope = delay (\x -> adv x)
{-# ANN advScope' ExpectError #-}
advScope' :: O (Int -> Int)
advScope' = delay (let f x = adv (delay x) in f)
{-# ANN grec ExpectError #-}
grec :: a
grec = grec
{-# ANN boxStream ExpectError #-}
boxStream :: Str Int -> Box (Str Int)
boxStream s = box (0 ::: tl s)
{-# ANN boxStream' ExpectError #-}
boxStream' :: Str Int -> Box (Str Int)
boxStream' s = box s
{-# ANN intDelay ExpectError #-}
intDelay :: Int -> O Int
intDelay = delay
{-# ANN intAdv ExpectError #-}
intAdv :: O Int -> Int
intAdv = adv
{-# ANN newDelay ExpectError #-}
newDelay :: a -> O a
newDelay x = delay x
{-# ANN mutualLoop ExpectError #-}
mutualLoop :: a
mutualLoop = mutualLoop'
{-# ANN mutualLoop' ExpectError #-}
mutualLoop' :: a
mutualLoop' = mutualLoop
{-# ANN constUnstable ExpectError #-}
constUnstable :: a -> Str a
constUnstable a = run
where run = a ::: delay run
{-# ANN mapUnboxed ExpectError #-}
mapUnboxed :: (a -> b) -> Str a -> Str b
mapUnboxed f = run
where run (x ::: xs) = f x ::: delay (run (adv xs))
{-# ANN mapUnboxedMutual ExpectError #-}
mapUnboxedMutual :: (a -> b) -> Str a -> Str b
mapUnboxedMutual f = run
where run (x ::: xs) = f x ::: delay (run' (adv xs))
run' (x ::: xs) = f x ::: delay (run (adv xs))
-- mutual recursive pattern definitions are not supported
-- foo1,foo2 :: Box (a -> b) -> Str a -> Str b
-- (foo1,foo2) = (\ f (x ::: xs) -> unbox f x ::: (delay (foo2 f) <#> xs),
-- \ f (x ::: xs) -> unbox f x ::: (delay (foo1 f) <#> xs))
{-# ANN nestedPattern ExpectError #-}
nestedPattern :: Box (a -> b) -> Str a -> Str b
nestedPattern = foo1 where
foo1,foo2 :: Box (a -> b) -> Str a -> Str b
(foo1,foo2) = (\ f (x ::: xs) -> unbox f x ::: (delay (foo2 f) <#> xs),
\ f (x ::: xs) -> unbox f x ::: (delay (foo1 f) <#> xs))
data Input = Input {jump :: !Bool, move :: Move}
data Move = StartLeft | EndLeft | StartRight | EndRight | NoMove
{-# ANN constS ExpectError #-}
-- Input is not a stable type (it is not strict). Therefore this
-- should not type check.
constS :: Input -> Str Input
constS a = a ::: delay (constS a)
-- Since Input is not strict, we cannot instantiate the 'const'
-- function.
-- Uncomment the definition below to check this.
-- constS' :: Input -> Str Input
-- constS' = const
{-# ANN main NotRattus #-}
main = putStrLn "This file should not type check"