MyNixOS website logo
Description

Make instance constraints bidirectional.

This package contains class for bidirectional instances and TH methods for generating instances for it. See README.md for more information

bidirectional-instances

This is a haskell package to provide wrapper class and useful template haskell instance-generator functions for bidirectional instances, i. e. for instance

instance (A a, B b) => C (Foo a b)

deduce not only forall a b. (A a, B b) => C (Foo a b), but also forall a b. C (Foo a b) => A a and forall a b. C (Foo a b) => B b. This behavior doesn't implemented in modern GHC version, but its very intuitive (and, of course, sound) if there are no overlapping instances for C (Foo a b).

There was a paper, related to this feature and an attempt to implement it as GHC extension. In the discussion about alternatives for that extension this solution was mentioned, but was discarded as "decidedly nontrivial, and some boilerplate is still required, which needs to be written for every instance". To reduce these downsides, instances from this package are made more general and template haskell function for generating boilerplate code are provided. I suppose that implementation this as an compiler extension probably would be better for performance, but I don't have enough qualification to implement it.

Documentation

Detailed documentation with examples can be found in the main module (Control.Bidirectional).

Usage

All function and classes you need to work with are exported from Control.Bidirectional.

To be implemented somewhere in the future

I'll try to make a GHC plugin to improve this solution in two directions:

  • no need for template haskell
  • more intuitive syntax

More precisely, I'd like to have the following syntax for declaring bidirectional instances:

instance {-# BIDIRECTIONAL #-} (A a, B b) => C (Foo a b)

and -XBidirectionalInstances to make all instances without OVERLAPS/OVERLAPPING/OVERLAPPABLE bidirectional by default.

Metadata

Version

0.1.0.0

License

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows