base-prelude- The most complete prelude formed solely from the "base" package

Safe HaskellNone




This module reexports most of the definitions from the "base" package, which are meant to be imported unqualified.

For details check out the source.


Reimplementations of functions presented in versions of "base" newer than 4.6


bool :: a -> a -> Bool -> a #

Case analysis for the Bool type. bool x y p evaluates to x when p is False, and evaluates to y when p is True.

This is equivalent to if p then y else x; that is, one can think of it as an if-then-else construct with its arguments reordered.


Basic usage:

>>> bool "foo" "bar" True
>>> bool "foo" "bar" False

Confirm that bool x y p and if p then y else x are equivalent:

>>> let p = True; x = "bar"; y = "foo"
>>> bool x y p == if p then y else x
>>> let p = False
>>> bool x y p == if p then y else x



(&) :: a -> (a -> b) -> b infixl 1 #

& is a reverse application operator. This provides notational convenience. Its precedence is one higher than that of the forward application operator $, which allows & to be nested in $.



($>) :: Functor f => f a -> b -> f b infixl 4 #

Flipped version of <$.


Replace the contents of a Maybe Int with a constant String:

>>> Nothing $> "foo"
>>> Just 90210 $> "foo"
Just "foo"

Replace the contents of an Either Int Int with a constant String, resulting in an Either Int String:

>>> Left 8675309 $> "foo"
Left 8675309
>>> Right 8675309 $> "foo"
Right "foo"

Replace each element of a list with a constant String:

>>> [1,2,3] $> "foo"

Replace the second element of a pair with a constant String:

>>> (1,2) $> "foo"



isSubsequenceOf :: Eq a => [a] -> [a] -> Bool #

The isSubsequenceOf function takes two lists and returns True if all the elements of the first list occur, in order, in the second. The elements do not have to occur consecutively.

isSubsequenceOf x y is equivalent to elem x (subsequences y).


>>> isSubsequenceOf "GHC" "The Glorious Haskell Compiler"
>>> isSubsequenceOf ['a','d'..'z'] ['a'..'z']
>>> isSubsequenceOf [1..10] [10,9..0]


sortOn :: Ord b => (a -> b) -> [a] -> [a] #

Sort a list by comparing the results of a key function applied to each element. sortOn f is equivalent to sortBy (comparing f), but has the performance advantage of only evaluating f once for each element in the input list. This is called the decorate-sort-undecorate paradigm, or Schwartzian transform.


uncons :: [a] -> Maybe (a, [a]) #

Decompose a list into its head and tail. If the list is empty, returns Nothing. If the list is non-empty, returns Just (x, xs), where x is the head of the list and xs its tail.



traceShowId :: Show a => a -> a #

Like traceShow but returns the shown value instead of a third value.


traceM :: Applicative f => String -> f () #

Like trace but returning unit in an arbitrary Applicative context. Allows for convenient use in do-notation.

Note that the application of traceM is not an action in the Applicative context, as traceIO is in the IO type. While the fresh bindings in the following example will force the traceM expressions to be reduced every time the do-block is executed, traceM "not crashed" would only be reduced once, and the message would only be printed once. If your monad is in MonadIO, liftIO . traceIO may be a better option.

... = do
  x <- ...
  traceM $ "x: " ++ show x
  y <- ...
  traceM $ "y: " ++ show y


traceShowM :: (Show a, Applicative f) => a -> f () #

Like traceM, but uses show on the argument to convert it to a String.

... = do
  x <- ...
  traceShowM $ x
  y <- ...
  traceShowM $ x + y