-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Named and unnamed implicit parameters with defaults. -- -- Named and unnamed implicit parameters with defaults using type classes -- and constraint hacks. For examples, see Data.Implicit. @package implicit-params @version 0.2 -- | Data.Implicit provides both named and unnamed implicit -- parameters that support default values (given by the Default -- class from the data-default package). It makes no use of the -- ImplicitParams extension and instead everything is done using -- type classes. -- -- Here is an example of unnamed implicit parameters: -- --
--   {-# LANGUAGE FlexibleContexts #-}
--   import Data.Implicit
--   
--   putParam :: Implicit_ String => IO ()
--   putParam = putStrLn $ "Param was: " ++ show (param_ :: String)
--   
-- -- We define putParam, which is a simple function which takes an -- implicit parameter of type String, and prints it to the -- screen. The param_ function is used to retrieve the unnamed -- implicit parameter of type String from putParam's -- context. The type signature is necessary to force param_ to -- return a String, as this cannot be inferred due to the -- polymorphism of show. -- --
--   >>> putParam
--   Param was ""
--   
-- -- This is how we call putParam without specifying its implicit -- parameters. If an implicit parameter is left unspecified, its value is -- defaulted to def, assuming that its type has a Default -- instance. If not, then it is a type error not to specify the value of -- an implicit parameter. -- --
--   >>> putParam $~ "hello, world"
--   Param was "hello, world"
--   
-- -- The operator $~ takes a function f and a value to -- which to set the homotypic implicit parameter on f. It -- applies the implicit parameter to f and returns the result. -- There is also a prefix version of $~ whose arguments are -- flipped called setParam_. -- -- Here is an example of named implicit parameters: -- --
--   {-# LANGUAGE DataKinds, FlexibleContexts, RankNTypes #-}
--   import Data.Implicit
--   import Data.Proxy
--   
--   foo :: Proxy "foo"
--   foo = Proxy
--   
--   bar :: Proxy "bar"
--   bar = Proxy
--   
--   putFooBar :: (Implicit "foo" String, Implicit "bar" String) => IO ()
--   putFooBar = do
--       putStrLn $ "foo was: " ++ show (param foo :: String)
--       putStrLn $ "bar was: " ++ show (param bar :: String)
--   
-- -- The Implicit constraint is the named equivalent of -- Implicit_. It takes an additional argument s to -- specify the name of the implicit parameter. Implicit parameters can be -- "named" using any type (of any kind, on compilers that support the -- PolyKinds extension). (The above code uses type-level strings -- of the Symbol kind from the GHC.TypeLits module, which -- is the recommended way to name implicit parameters. However, -- Symbol requires the DataKinds extension and at least -- version 7.8 of GHC (7.6 is broken; see GHC bug #7502), so you are free -- to use other types of other kinds if you want to support older -- versions of GHC.) param and setParam work like their -- unnamed counterparts param_ and setParam_, but they also -- take a proxy argument to specify the name of the implicit parameter. -- The code above defines foo and bar to hide away the -- (slightly ugly) proxy stuff. -- --
--   >>> putFooBar
--   foo was: ""
--   bar was: ""
--   
-- -- Once again, the defaults of unspecified implicit parameters are given -- by the Default class. -- --
--   >>> setParam foo "hello, world" putFooBar
--   foo was: "hello, world"
--   bar was: ""
--   
-- --
--   >>> setParam bar "goodbye" $ setParam foo "hello, world" putFooBar
--   foo was: "hello, world"
--   bar was: "goodbye"
--   
-- -- An infix version of setParam is also provided, ~$. -- Using ~$, the above example would be: -- --
--   >>> putFooBar ~$ foo ~$ bar $$ "goodbye" $$ "hello, world"
--   foo was: "hello, world"
--   bar was: "goodbye
--   
module Data.Implicit -- | The constraint Implicit "foo" String on a function -- f indicates that an implicit parameter named "foo" -- of type String is passed to f. class Implicit s a param :: Implicit s a => proxy s -> a -- | setParam supplies a value for an implicit parameter named -- s to a function which takes a homotypic and homonymous -- implicit parameter. The name s is specified by a proxy -- argument passed to setParam. setParam :: proxy s -> a -> (Implicit s a => b) -> b -- | An infix version of setParam with flipped arguments. (~$) :: (Implicit s a => b) -> proxy s -> a -> b -- | A left-associated version of $. ($$) :: (a -> b) -> a -> b -- | The constraint Implicit_ String on a function -- f indicates that an unnamed implicit parameter of type -- String is passed to f. class Implicit_ a param_ :: Implicit_ a => a -- | setParam_ supplies a value for an unnamed implicit parameter to -- a function which takes a homotypic implicit parameter. setParam_ :: a -> (Implicit_ a => b) -> b -- | An infix version of setParam_ with flipped arguments. ($~) :: (Implicit_ a => b) -> a -> b instance Default a => Implicit_ a instance Default a => Implicit k s a