-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Branch on whether a constraint is satisfied -- -- This library provides a mechanism that can be used to branch on -- whether a constraint is satisfied (not limited to typeclass instances, -- despite the name of the library). -- -- Usage example: -- --
-- {-# OPTIONS_GHC -fplugin=IfSat.Plugin #-}
--
-- module MyModule where
--
-- import Data.Constraint.If ( IfSat(ifSat) )
--
-- hypot :: forall a. ( Floating a, IfSat (FMA a) ) => a -> a -> a
-- hypot = ifSat @(FMA a) withFMA withoutFMA
-- where
-- withFMA :: FMA a => a -> a -> a
-- withFMA a b =
-- let
-- h = sqrt $ fma a a (b * b)
-- h² = h * h
-- a² = a * a
-- x = fma (-b) b (h² - a²) + fma h h (-h²) - fma a a (-a²)
-- in
-- h - x / ( 2 * h )
-- withoutFMA :: a -> a -> a
-- withoutFMA a b = sqrt ( a * a + b * b )
--
--
-- Here we select between two ways of computing the hypotenuse function
-- based on whether we have access to the fused multiply-add operation
--
-- -- fma :: FMA a => a -> a -> a -> a ---- -- which computes \ a b c -> ( a * b ) + c in a single -- instruction, providing stronger guarantees about precision of the -- resul. -- -- A call of the form hypot @MyNumberType will either use the -- robust withFMA function when an FMA MyNumberType -- instance is available, or will fallback to the simple -- withoutFMA implementation when no such instance can be found. @package if-instance @version 0.2.0.0 module M1 showFun :: forall (a :: Type). IfSat (Show (a -> a)) => (a -> a) -> String test1 :: (Bool -> Bool) -> String module M2 test2 :: (a -> a) -> String test3 :: (Bool -> Bool) -> String test :: String instance GHC.Show.Show (GHC.Types.Bool -> GHC.Types.Bool)