MyNixOS website logo
Description

Bidirectional Haskell/PureScript expression translator.

Parses Haskell and PureScript expressions into a shared AST, then prints them back in either language with correct syntax. Handles divergent syntax like record access, tuples, cons patterns, and record field separators. Designed for translating typeclass instance method bodies.

purekell

Bidirectional Haskell/PureScript expression translator. Parses expressions from either language into a shared AST, then prints them back in the target language with correct syntax.

Built to complement purescript-bridge — while purescript-bridge generates PureScript types from Haskell types, purekell translates expressions (specifically typeclass instance method bodies).

Usage

import Purekell

-- Translate expressions between languages
hsToPs "uid x == uid y"           -- Right "x.uid == y.uid"
psToHs "x.uid == y.uid"           -- Right "uid x == uid y"

-- Parse and print instance method bodies
import Purekell.Instance

parseMethodBody "eq x y = x == y" -- Right [MethodEquation ...]
printMethodBody Haskell eqs       -- "eq x y = x == y"
printMethodBody PureScript eqs    -- "eq x y = x == y"

Supported syntax

Expressions: literals (int, float, char, string), variables, constructors, application, infix operators (symbolic and backtick), lambda, if/then/else, case/of, let/in, do notation, negation, tuples, lists, operator sections, where clauses, type annotations, record construction/update, qualified names.

Patterns: variable, constructor, literal, wildcard, tuple, list, cons, as-pattern, negated literal, record.

Types: constructors, variables, application, function arrows, qualified constructors.

Divergent syntax

Most syntax is shared between Haskell and PureScript. The printer handles these divergences:

ConstructHaskellPureScript
Record accessfield recrec.field
Tuples(a, b, c)Tuple a (Tuple b c)
Cons patternsx : xsCons x xs
Record constructionFoo { bar = 1 }Foo { bar: 1 }
Record patternsFoo { bar = x }Foo { bar: x }

Architecture

  • Purekell.AST — Shared AST types (Expr, Pat, Type, Binding, etc.)
  • Purekell.Parser — Megaparsec-based parser, parameterized for language-specific postfix (e.g. PS dot access)
  • Purekell.Printer — Target-aware printer with correct parenthesization
  • Purekell.CodecCodec a pairs a parser with a printer; provides runParse, runPrint, roundtrip
  • Purekell.Haskell / Purekell.PureScript — Language-specific codec instances
  • Purekell.Instance — Parsing/printing of typeclass method equations (name pat1 pat2 = body)

Testing

cd purekell && stack test

331 tests covering parse, print, roundtrip (Haskell, PureScript, cross-language), and property-based roundtrip tests using QuickCheck with Arbitrary instances for all AST types.

Metadata

Version

0.1.0.0

License

Platforms (80)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    uefi
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-uefi
  • aarch64-windows
  • aarch64_be-none
  • arc-linux
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • 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-linux
  • 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
  • sh4-linux
  • 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-uefi
  • x86_64-windows