Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
Use case for Free Applicatives
{-# LANGUAGE RankNTypes #-}
-- See
import Control.Applicative
import Data.Functor.HFree
data MarketData a
data MarketKey
request :: MarketData a -> MarketKey
request = undefined
data Market
getMarketData :: Market -> MarketData a -> a
getMarketData = undefined
type P a = HFree Applicative MarketData a
eval :: Applicative g => (forall b. f b -> g b) -> HFree Applicative f a -> g a
eval = rightAdjunct
get :: MarketData a -> P a
get = liftFree
dependencies :: P a -> [MarketKey]
dependencies = getConst . eval (Const . (:[]) . request)
runP :: (Applicative m, Monad m) => ([MarketKey] -> m Market) -> P a -> m a
runP loadMarket pricer = do
let deps = dependencies pricer
mkt <- loadMarket deps
return $ iter (getMarketData mkt) pricer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.