MyNixOS website logo
Description

A magic typeclass that just does it.

This plugin allows you to write

{-# OPTIONS_GHC -fplugin GHC.JustDoIt.Plugin #-}
module Test where

import GHC.JustDoIt

foo :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r)
foo = (…)

without having to write the actual implementation of foo.

See examples/Demo.hs for a few examples of what this plugin can do for you.

ghc-justdoit: a GHC plugin to write the code for you

This is a prototype of a code synthesis plugin for GHC, which uses LJT proof search to instantiate a type.

Synopsis

{-# OPTIONS_GHC -fplugin=GHC.JustDoIt.Plugin #-}
module Test where

import GHC.JustDoIt

foo :: ((a -> r) -> r) -> (a -> ((b -> r) -> r)) -> ((b -> r) -> r)
foo = (…)

Missing bits

  • The LJT might not be complete, due to insufficient backtracking.
  • The implementation is very much unoptimized.
  • It returns one solution, but not necessary the “best” one. But what is the “best” one?
  • It ignores any recursive type, so it cannot do anything with lists. It would be much more useful if it could do some best-effort thing here as well.
  • It ignores linear types, and will likely produce ill-typed expressions for them.

If someone wants to pick it up from here, that’d be great!

Related work

Contact

Please reports bugs and missing features at the GitHub bugtracker. This is also where you can find the source code.

ghc-justdoit was written by Joachim Breitner and is licensed under a permissive MIT license.

Metadata

Version

0.1.0.2

License

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • 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