{-# LANGUAGE Arrows #-}

module ShouldCompile where

import Control.Arrow

f :: Arrow a => a (Int,Int,Int) Int
f = proc (x,y,z) -> returnA -< x+y

g :: Arrow a => Int -> a Int Int
g x = proc y -> returnA -< x*y

h :: Arrow a => Int -> a (Int,Int) Int
h x = proc (y,z) -> do
        a <- f -< (x,y,3)
        b <- g (2+x) -< y+a
        returnA -< a*b+z
