-- 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.1 -- | 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
--   
--   putFooBar :: (Implicit "foo" String, Implicit "bar" String) => IO ()
--   putFooBar = do
--       putStrLn $ "foo was: " ++ show foo
--       putStrLn $ "bar was: " ++ show bar
--   
--   foo :: Implicit "foo" String => String
--   foo = param (Proxy :: Proxy "foo")
--   
--   bar :: Implicit "bar" String => String
--   bar = param (Proxy :: Proxy "bar")
--   
--   setFoo :: String -> (Implicit "foo" String => a) -> a
--   setFoo = setParam (Proxy :: Proxy "foo")
--   
--   setBar :: String -> (Implicit "bar" String => a) -> a
--   setBar = setParam (Proxy :: Proxy "bar")
--   
-- -- The Implicit constraint is the named equivalent of -- Implicit_. It takes an additional argument of kind -- Symbol (which requires the DataKinds extension; see -- the GHC.TypeLits module) to specify the name of the implicit -- parameter. 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 the wrappers foo and bar and -- setFoo and setBar around param and -- setParam respectively, which hide all the (slightly ugly) -- proxy stuff. -- --
--   >>> putFooBar
--   foo was: ""
--   bar was: ""
--   
-- -- Once again, the defaults of unspecified implicit parameters are given -- by the Default class. -- --
--   >>> setFoo "hello, world" putFooBar
--   foo was: "hello, world"
--   bar was: ""
--   
-- --
--   >>> setBar "goodbye" $ setFoo "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 $$~ (Proxy :: Proxy "foo", "hello, world") $$~ (Proxy :: Proxy "bar", "goodbye")
--   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. -- -- The name "foo" is a type of kind Symbol (from the -- GHC.TypeLits module). The DataKinds extension is -- required to refer to Symbol-kinded types. class Implicit (s :: Symbol) a -- | param retrieves the implicit parameter named s of type -- a from the context Implicit s a. The name -- s is specified by a proxy argument passed to param. 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 -- | The constraint Implicit_ String on a function -- f indicates that an unnamed implicit parameter of type -- String is passed to f. type Implicit_ = Implicit Any -- | param_ retrieves the unnamed implicit parameter of type -- a from the context 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 [overlap ok] (?param::Tagged s a) => Implicit s (Lift a) instance [overlap ok] Default a => Implicit s a