| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Effectful.NonDet
Contents
Description
Provider of the Alternative and
MonadPlus instance for Eff.
Synopsis
- data NonDet :: Effect where
- data OnEmptyPolicy
- runNonDet :: OnEmptyPolicy -> Eff (NonDet ': es) a -> Eff es (Either CallStack a)
- emptyEff :: (HasCallStack, NonDet :> es) => Eff es a
- sumEff :: (HasCallStack, Foldable t, NonDet :> es) => t (Eff es a) -> Eff es a
- class Applicative f => Alternative (f :: Type -> Type) where
- type HasCallStack = ?callStack :: CallStack
- data CallStack
- getCallStack :: CallStack -> [([Char], SrcLoc)]
- prettyCallStack :: CallStack -> String
Effect
data NonDet :: Effect where Source #
Provide the ability to use the Alternative and MonadPlus instance of
Eff.
Since: 2.2.0.0
Instances
| type DispatchOf NonDet Source # | |
Defined in Effectful.Internal.Monad | |
data OnEmptyPolicy Source #
Policy of dealing with modifications to thread local state in the
environment in branches that end up calling the Empty operation.
Note: OnEmptyKeep is significantly faster as there is no need to back up
the environment on each call to :<|>:.
Since: 2.2.0.0
Constructors
| OnEmptyKeep | Keep modifications on |
| OnEmptyRollback | Rollback modifications on |
Instances
| Generic OnEmptyPolicy Source # | |
Defined in Effectful.NonDet Associated Types type Rep OnEmptyPolicy :: Type -> Type # | |
| Show OnEmptyPolicy Source # | |
Defined in Effectful.NonDet Methods showsPrec :: Int -> OnEmptyPolicy -> ShowS # show :: OnEmptyPolicy -> String # showList :: [OnEmptyPolicy] -> ShowS # | |
| Eq OnEmptyPolicy Source # | |
Defined in Effectful.NonDet Methods (==) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # (/=) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # | |
| Ord OnEmptyPolicy Source # | |
Defined in Effectful.NonDet Methods compare :: OnEmptyPolicy -> OnEmptyPolicy -> Ordering # (<) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # (<=) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # (>) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # (>=) :: OnEmptyPolicy -> OnEmptyPolicy -> Bool # max :: OnEmptyPolicy -> OnEmptyPolicy -> OnEmptyPolicy # min :: OnEmptyPolicy -> OnEmptyPolicy -> OnEmptyPolicy # | |
| type Rep OnEmptyPolicy Source # | |
Handlers
runNonDet :: OnEmptyPolicy -> Eff (NonDet ': es) a -> Eff es (Either CallStack a) Source #
Run the NonDet effect with a given OnEmptyPolicy.
Note: :<|>: executes the second computation if (and only if) the first
computation calls Empty.
Since: 2.2.0.0
Utils
emptyEff :: (HasCallStack, NonDet :> es) => Eff es a Source #
Specialized version of empty with the HasCallStack constraint for
tracking purposes.
Since: 2.2.0.0
sumEff :: (HasCallStack, Foldable t, NonDet :> es) => t (Eff es a) -> Eff es a Source #
Specialized version of asum with the HasCallStack constraint for
tracking purposes.
Since: 2.2.0.0
Re-exports
class Applicative f => Alternative (f :: Type -> Type) where #
A monoid on applicative functors.
If defined, some and many should be the least solutions
of the equations:
Methods
The identity of <|>
(<|>) :: f a -> f a -> f a infixl 3 #
An associative binary operation
One or more.
Zero or more.
Instances
type HasCallStack = ?callStack :: CallStack #
Request a CallStack.
NOTE: The implicit parameter ?callStack :: CallStack is an
implementation detail and should not be considered part of the
CallStack API, we may decide to change the implementation in the
future.
Since: base-4.9.0.0
CallStacks are a lightweight method of obtaining a
partial call-stack at any point in the program.
A function can request its call-site with the HasCallStack constraint.
For example, we can define
putStrLnWithCallStack :: HasCallStack => String -> IO ()
as a variant of putStrLn that will get its call-site and print it,
along with the string given as argument. We can access the
call-stack inside putStrLnWithCallStack with callStack.
>>>:{putStrLnWithCallStack :: HasCallStack => String -> IO () putStrLnWithCallStack msg = do putStrLn msg putStrLn (prettyCallStack callStack) :}
Thus, if we call putStrLnWithCallStack we will get a formatted call-stack
alongside our string.
>>>putStrLnWithCallStack "hello"hello CallStack (from HasCallStack): putStrLnWithCallStack, called at <interactive>:... in interactive:Ghci...
GHC solves HasCallStack constraints in three steps:
- If there is a
CallStackin scope -- i.e. the enclosing function has aHasCallStackconstraint -- GHC will append the new call-site to the existingCallStack. - If there is no
CallStackin scope -- e.g. in the GHCi session above -- and the enclosing definition does not have an explicit type signature, GHC will infer aHasCallStackconstraint for the enclosing definition (subject to the monomorphism restriction). - If there is no
CallStackin scope and the enclosing definition has an explicit type signature, GHC will solve theHasCallStackconstraint for the singletonCallStackcontaining just the current call-site.
CallStacks do not interact with the RTS and do not require compilation
with -prof. On the other hand, as they are built up explicitly via the
HasCallStack constraints, they will generally not contain as much
information as the simulated call-stacks maintained by the RTS.
A CallStack is a [(String, SrcLoc)]. The String is the name of
function that was called, the SrcLoc is the call-site. The list is
ordered with the most recently called function at the head.
NOTE: The intrepid user may notice that HasCallStack is just an
alias for an implicit parameter ?callStack :: CallStack. This is an
implementation detail and should not be considered part of the
CallStack API, we may decide to change the implementation in the
future.
Since: base-4.8.1.0
getCallStack :: CallStack -> [([Char], SrcLoc)] #
Extract a list of call-sites from the CallStack.
The list is ordered by most recent call.
Since: base-4.8.1.0
prettyCallStack :: CallStack -> String #
Pretty print a CallStack.
Since: base-4.9.0.0