modern-uri: Modern library for working with URIs

[ bsd3, library, text ] [ Propose Tags ]

Modern library for working with URIs.

[Skip to Readme]
Versions [faq],,,,,,,,,,,
Change log
Dependencies base (>=4.7 && <5.0), bytestring (>=0.2 && <0.11), containers (==0.5.*), contravariant (>=1.3 && <2.0), deepseq (>=1.3 && <1.5), exceptions (>=0.6 && <0.9), megaparsec (>=6.0 && <6.4), profunctors (>=5.2.1 && <6.0), QuickCheck (>=2.4 && <3.0), semigroups (==0.18.*), template-haskell (>=2.10 && <2.13), text (>=0.2 && <1.3) [details]
License BSD-3-Clause
Author Mark Karpov <>
Maintainer Mark Karpov <>
Revised Revision 1 made by mrkkrp at Sun Dec 31 09:25:28 UTC 2017
Category Text
Home page
Bug tracker
Source repo head: git clone
Uploaded by mrkkrp at Sat Oct 28 09:44:00 UTC 2017
Distributions LTSHaskell:, NixOS:, Stackage:
Downloads 3170 total (121 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2017-10-28 [all 1 reports]





Turn on development settings.


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for modern-uri-

[back to package description]

Modern URI

License BSD3 Hackage Stackage Nightly Stackage LTS Build Status Coverage Status

This is a modern library for working with URIs in Haskell as per RFC 3986:


There are already at least two libraries for working with URIs: uri and uri-bytestring. Why write one more?

Let's see first about the uri package:

  • It uses String instead of Text or ByteString, it is thus inefficient.
  • The types are not very precise. Query string is represented as Maybe String for example.
  • Uses Parsec under the hood, however does not allow us to use its URI parser in a bigger Parsec parser.

Now what about uri-bytestring?

  • Works with ByteString, which totally makes sense because a URI can have only ASCII characters in it. However sometimes a URI is a part of a bigger document that can contain Unicode characters and so we may need to parse a URI from Text or render it to Text. Ideally, we would like to be able to parse from both Text and ByteString as well to render to both Text and ByteString.
  • Does not allow to use its URI parser as part of a bigger parser.
  • Provides newtype wrappers for different components of URI, but we could still put something incorrect inside.
  • Absolute and relative URI references have different types, which may or may not be handy.
  • Provides lenses, but does not provide e.g. traversal for working with query parameters selected by their names.


The modern-uri package features:

  • Correct by construction URI data type. Correctness is ensured by guaranteeing that every sub-component of the URI record is by itself cannot be invalid. This boils down to careful use of types and a set of smart constructors for things like scheme, host, etc.
  • Absolute and relative URIs differ only by the scheme component: if it's Nothing, then URI is relative, otherwise it's absolute.
  • Megaparsec parser that can be used as a standalone smart constructor for the URI data type (see mkURI) as well as be seamlessly integrated into a bigger Megaparsec parser.
  • Fast rendering to strict Text and ByteString as well as to their respective Builder types.
  • Extensive set of lensy helpers for easier manipulation of the nested data types (see Text.URI.Lens).
  • Quasi-quoters for compile-time construction of the URI data type and refined text types (see Text.URI.QQ).


  • Provide parser that can parse URIs from ByteStrings.


Issues, bugs, and questions may be reported in the GitHub issue tracker for this project.

Pull requests are also welcome and will be reviewed quickly.


Copyright © 2017 Mark Karpov

Distributed under BSD 3 clause license.