linear-generics: Generic programming library for generalised deriving.

[ bsd3, generics, library ] [ Propose Tags ] [ Report a vulnerability ]

This package offers a version of GHC.Generics with two important improvements:

  1. The to, from, to1, and from1 methods have multiplicity-polymorphic types, allowing them to be used with either traditional Haskell code or linearly typed code.

  2. The representations used for Generic1 are modified slightly. As a result, to1 and from1 never need to use fmap. This can greatly improve performance, and it is necessary to support multiplicity polymorphism. A smaller change, approximately as proposed by spl, reduces the number of instances that must be written to actually use Generic1 for deriving instances of other classes.

For more details, see the Generics.Linear documentation.

The implementation is based on the generic-deriving package, first described in the paper

  • A generic deriving mechanism for Haskell. Jose Pedro Magalhaes, Atze Dijkstra, Johan Jeuring, and Andres Loeh. Haskell'10.

This library is organized as follows:

  • Generics.Linear defines the core functionality for generics, including the multiplicity-polymorphic Generic(1) classes and a replacement for the :.: composition type.

  • Generics.Linear.TH implements Template Haskell functionality for deriving instances of Generic(1).

  • Generics.Linear.Unsafe.ViaGHCGenerics offers DerivingVia targets to derive Generic and Generic1 instances from GHC.Generics.GHC.Generics.Generic. Because these instances necessarily use unsafe coercions, their use will likely inhibit full optimization of code using them.

Educational code: the educational modules exported by generic-deriving have been copied into the tests/Generic/Deriving directory in this repository, with the very few modifications required to accommodate the differences between the Generic1 representations here and in base. All the same caveats apply as in the originals; see that package's README.


[Skip to Readme]

Modules

[Index] [Quick Jump]

Downloads

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

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.1.0.1, 0.2, 0.2.1, 0.2.2, 0.2.3 (info)
Change log CHANGELOG.md
Dependencies base (>=4.15 && <5), containers (>=0.5.9 && <0.8), ghc-prim (<1), template-haskell (>=2.16 && <2.23), th-abstraction (>=0.5 && <0.8) [details]
Tested with ghc ==9.0.2, ghc ==9.2.7, ghc ==9.4.4, ghc ==9.6.1, ghc ==9.8.1
License BSD-3-Clause
Copyright 2011-2013 Universiteit Utrecht, University of Oxford, Ryan Scott, 2021 David Feuer
Author José Pedro Magalhães
Maintainer David.Feuer@gmail.com
Revised Revision 2 made by aspiwack at 2024-05-23T13:41:47Z
Category Generics
Home page https://github.com/linear-generics/linear-generics
Bug tracker https://github.com/linear-generics/linear-generics/issues
Source repo head: git clone https://github.com/linear-generics/linear-generics
Uploaded by aspiwack at 2024-01-09T13:27:10Z
Distributions Arch:0.2.1, LTSHaskell:0.2.3, NixOS:0.2.3, Stackage:0.2.3
Reverse Dependencies 2 direct, 15 indirect [details]
Downloads 1805 total (66 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2024-01-09 [all 1 reports]

Readme for linear-generics-0.2.3

[back to package description]

linear-generics: Generic programming library with linearity support

Hackage Hackage Dependencies Haskell Programming Language BSD3 License Build Status

This package offers a version of GHC.Generics with two important improvements:

  1. The to, from, to1, and from1 methods have multiplicity-polymorphic types, allowing them to be used with either traditional Haskell code or linearly typed code.

  2. The representations used for Generic1 are modified slightly.

    • Composition associates to the left in the generic representation. As a result, to1 and from1 never need to use fmap. This can greatly improve performance, and it is necessary to support multiplicity polymorphism, as discussed here.
    • Generic representations no longer use Rec1 f, they use Par1 :.: f instead, as proposed by spl. This way you no longer need to write Rec1 instances for your derivers.

    For more details, see the Generics.Linear documentation.

This library is organized as follows:

  • Generics.Linear defines the core functionality for generics. This includes:

    • multiplicity polymorphic Generic and Generic1 classes,
    • a replacement for the :.: composition type, and
    • an MP1 type for nonlinear and multiplicity polymorphic fields.
  • Generics.Linear.TH implements Template Haskell functionality for deriving instances of Generic(1).

  • Generics.Linear.Unsafe.ViaGHCGenerics offers DerivingVia targets to derive both Generic and Generic1 instances from GHC.Generics.Generic. Because these instances necessarily use unsafe coercions, their use will likely inhibit full optimization of code using them (see this wiki page for more on the GHC internals, along with commentary in Unsafe.Coerce).

Educational code: the educational modules exported by generic-deriving have been copied into the tests/Generic/Deriving directory in this repository, with the very few modifications required to accommodate the differences between the Generic1 representations here and in base. All the same caveats apply as in the originals; see that package's README.