Created
June 12, 2012 08:45
-
-
Save MgaMPKAy/2916256 to your computer and use it in GitHub Desktop.
Arrow example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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