HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulestreamly-core-0.2.2Haskell2010

Streamly.Data.ParserK

See the general notes about parsing in the Streamly.Data.Parser module. This module implements a using Continuation Passing Style (CPS) wrapper over the Streamly.Data.Parser module. It is as fast or faster than attoparsec.

Parser vs ParserK

ParserK is preferred over Streamly.Data.Parser.Parser when extensive applicative, alternative and monadic composition is required, or when recursive or dynamic composition of parsers is required. The Streamly.Data.Parser.Parser type fuses statically and creates efficient loops whereas ParserK uses function call based composition and has comparatively larger runtime overhead but it is better suited to the specific use cases mentioned above. ParserK also allows to efficient parse a stream of arrays, it can also break the input stream into a parse result and remaining stream so that the stream can be parsed independently in segments.

Using ParserK

All the parsers from the Streamly.Data.Parser module can be adapted to ParserK using the Streamly.Data.ParserK.adaptC, adapt, and adaptCG combinators.

Streamly.Data.StreamK.parseChunks runs a parser on a stream of unboxed arrays, this is the preferred and most efficient way to parse chunked input. The more general Streamly.Data.StreamK.parseBreakChunks function returns the remaining stream as well along with the parse result. There are parseChunksGeneric, parseBreakChunksGeneric as well to run parsers on boxed arrays. parse, parseBreak run parsers on a stream of individual elements instead of stream of arrays.

Monadic Composition

Monad composition can be used for lookbehind parsers, we can dynamically compose new parsers based on the results of the previously parsed values.

If we have to parse "a9" or "9a" but not "99" or "aa" we can use the following non-monadic, backtracking parser:

Example2 expressions
digits p1 p2 = ((:) <$> p1 <*> ((:) <$> p2 <*> pure [])):{backtracking :: Monad m => ParserK Char m Stringbacktracking = ParserK.adapt $    digits (Parser.satisfy isDigit) (Parser.satisfy isAlpha)    <|>    digits (Parser.satisfy isAlpha) (Parser.satisfy isDigit):}

We know that if the first parse resulted in a digit at the first place then the second parse is going to fail. However, we waste that information and parse the first character again in the second parse only to know that it is not an alphabetic char. By using lookbehind in a Monad composition we can avoid redundant work:

Example1 expression
data DigitOrAlpha = Digit Char | Alpha Char
Example1 expression
:{lookbehind :: Monad m => ParserK Char m Stringlookbehind = do    x1 <- ParserK.adapt $             Digit <$> Parser.satisfy isDigit         <|> Alpha <$> Parser.satisfy isAlpha    -- Note: the parse depends on what we parsed already    x2 <- ParserK.adapt $          case x1 of             Digit _ -> Parser.satisfy isAlpha             Alpha _ -> Parser.satisfy isDigit    return $ case x1 of        Digit x -> [x,x2]        Alpha x -> [x,x2]:}

Experimental APIs

Please refer to Streamly.Internal.Data.ParserK for functions that have not yet been released.

  • 1 type
  • 8 values

Setup

0 declarations

To execute the code examples provided in this module in ghci, please run the following commands first.

Example3 expressions
:mimport Control.Applicative ((<|>))import Data.Char (isDigit, isAlpha)
Example2 expressions
import Streamly.Data.Parser (Parser)import Streamly.Data.ParserK (ParserK)
Example2 expressions
import qualified Streamly.Data.Parser as Parserimport qualified Streamly.Data.ParserK as ParserK

For APIs that have not been released yet.

Example1 expression
import qualified Streamly.Internal.Data.ParserK as ParserK

Parser Type

1 declaration
newtypenewtype ParserK a (m :: Type -> Type) b
#

A continuation passing style parser representation. A continuation of Steps, each step passes a state and a parse result to the next Step. The resulting Step may carry a continuation that consumes input a and results in another Step. Essentially, the continuation may either consume input without a result or return a result with no further input to be consumed.

Instances7Monad, Functor, MonadFail, Applicative, Alternative, MonadPlus, …
  • Monad m => Monad (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

    Monad composition can be used for lookbehind parsers, we can dynamically compose new parsers based on the results of the previously parsed values.

  • Functor m => Functor (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

    Map a function on the result i.e. on b in Parser a m b.

  • Monad m => MonadFail (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type
  • Monad m => Applicative (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

    f <$> p1 <*> p2 applies parsers p1 and p2 sequentially to an input stream. The first parser runs and processes the input, the remaining input is then passed to the second parser. If both parsers succeed, their outputs are applied to the function f. If either parser fails, the operation fails.

  • Monad m => Alternative (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

    p1 <|> p2 passes the input to parser p1, if it succeeds, the result is returned. However, if p1 fails, the parser driver backtracks and tries the same input on the alternative parser p2, returning the result if it succeeds.

  • Monad m => MonadPlus (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

    mzero is same as empty, it aborts the parser. mplus is same as <|>, it selects the first succeeding parser.

  • MonadIO m => MonadIO (ParserK a m)Defined in streamly-core-0.2.2 · Streamly.Internal.Data.ParserK.Type

Parsers

0 declarations

Conversions

Without Input

valuefromPure :: b -> ParserK a m b
#

A parser that always yields a pure value without consuming any input.

Pre-release

valuedie :: String -> ParserK a m b
#

A parser that always fails with an error message without consuming any input.

Pre-release

Deprecated

2 declarations