Skip to content

Instantly share code, notes, and snippets.

@MgaMPKAy
Created June 12, 2012 08:45
Show Gist options
  • Save MgaMPKAy/2916256 to your computer and use it in GitHub Desktop.
Save MgaMPKAy/2916256 to your computer and use it in GitHub Desktop.
Arrow example
{-# LANGUAGE Arrows #-}
module Main where
import Control.Arrow
import Control.Monad
import qualified Control.Category as Cat
import Data.List
import Data.Maybe
import System.Random
newtype Circuit a b = Circuit { unCircuit :: a -> (Circuit a b, b) }
instance Cat.Category Circuit where
id = Circuit $ \a -> (Cat.id, a)
(.) = dot
where
(Circuit cir2) `dot` (Circuit cir1) = Circuit $ \a ->
let (cir1', b) = cir1 a
(cir2', c) = cir2 b
in (cir2' `dot` cir1', c)
instance Arrow Circuit where
arr f = Circuit $ \a -> (arr f, f a)
first (Circuit cir) = Circuit $ \(b, d) ->
let (cir', c) = cir b
in (first cir', (c, d))
runCircuit _ [] = []
runCircuit cir (x:xs) =
let (cir', x') = unCircuit cir x
in x' : runCircuit cir' xs
runCircuit' cir inputs =
snd $ mapAccumL (\cir x -> unCircuit cir x) cir inputs
accum :: acc -> (a -> acc -> (b, acc)) -> Circuit a b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment