shade: A control structure used to combine heterogenous types with delayed effects.

[ bsd3, control, library ] [ Propose Tags ]
Dependencies base (>=4.8 && <5), mtl (>=2.2.1), transformers (>= [details]
License BSD-3-Clause
Copyright Copyright: (c) 2017 Frederik Hanghøj Iversen
Author Frederik Hanghøj Iversen
Revised Revision 1 made by HerbertValerioRiedel at Sun May 21 07:14:14 UTC 2017
Category Control
Home page
Source repo head: git clone
Uploaded by fredefox at Sat May 20 19:03:30 UTC 2017
Distributions NixOS:
Downloads 1831 total (17 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2017-05-20 [all 1 reports]
Hackage Matrix CI

Please see the README.

[Skip to Readme]




Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for shade-

[back to package description]
{-# LANGUAGE MultiParamTypeClasses #-}
module Main ( main ) where

import Data.Functor.Identity
import Control.Monad

import Control.Monad.Shade

A shade can be used to save heterogeneous types in containers with the same type e.g. using a type-class as a common denominator:

showshade :: Applicative m => Show a => a -> Shade m String
showshade a = pure (show a)

hetero :: Shade Identity String
hetero = mconcat [ showshade () , showshade 2 , showshade "hej" ]

The values inside a shade are stored in a context. We can swap this context by defining a transfer function:

idToIO :: Identity b -> IO b
idToIO (Identity v) = putStrLn "Transferring" *> pure v

The context is switched using transfer and we can access the value in this new context by using shadow:

runInIO :: Shade Identity a -> IO a
runInIO = shadow . transfer idToIO

The point to note about this example is that the values are stored in an shades with the identity as context. We can manipulate this context including the value. We cannot, however inspect the value since it is universally quantified.

noisy :: String -> Shade Identity (IO ())
noisy s = pure (putStrLn s)
main :: IO ()
main = do
  r <- runInIO hetero
  putStrLn r
  join . runInIO . mconcat . map (noisy . show) $ [0..10]