1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
{-# LANGUAGE Arrows #-}
foo
f
g
h
ma =
proc
( (a, b),
(c, d),
(e, f)
)
-> do
-- Begin do
(x, y) <- -- GHC parser fails if layed out over multiple lines
f -- Call into f
( a,
c -- Tuple together arguments
)
( b,
d
)
-<
( b + 1, -- Funnel into arrow
d * b
)
if x `mod` y == 0 -- Basic condition
then case e of -- Only left case is relevant
Left
( z,
w
) -> \u -> -- Procs can have lambdas
let v =
u -- Actually never used
^ 2
in ( returnA
-<
-- Just do the calculation
(x + y * z)
)
else do
let u = x -- Let bindings bind expressions, not commands
-- Could pattern match directly on x
i <- case u of
0 -> (g . h -< u)
n ->
( ( h . g
-<
y -- First actual use of y
)
)
returnA -< ()
-- Sometimes execute effects
if i > 0
then ma -< ()
else returnA -< ()
returnA
-<
( i
+ x
* y -- Just do the calculation
)
|