reason-export: Generate Reason types from Haskell

[ library, mit, web ] [ Propose Tags ]

Please see the README on GitHub at

[Skip to Readme]
Versions [faq],,
Change log
Dependencies base (>=4.7 && <5), bytestring, containers, directory, formatting, hashable, mtl, text, time, wl-pprint-text [details]
License MIT
Copyright 2019 Andrei Barbu
Author Andrei Barbu
Category Web
Home page
Bug tracker
Source repo head: git clone
Uploaded by AndreiBarbu at 2019-06-01T07:54:26Z
Distributions NixOS:
Downloads 938 total (13 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2019-06-01 [all 1 reports]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for reason-export-

[back to package description]

Reason Export

Build Status <img src="" alt="reason" height="20"/> <img src="" alt="reason" height="20"/>

Create Reason classes and JSON encoders/decoders from Haskell DataTypes. Originally build by converting elm-export to Reason.

More docs on Hackage.


If you're using this package you almost certainly want to use servant-reason as well. There are tests in both packages that show to use this library.

Usage is trivial, derive Generic and ReasonType.

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}

module Db where

import Reason
import GHC.Generics

data Person = Person
  { id :: Int
  , name :: Maybe String
  } deriving (Show, Eq, Generic, ReasonType)

Then you can expose your API:

module Main where

import Data.Proxy
import Reason
import           Data.Text hiding (intercalate, map)
import Db

main :: IO ()
main = do
  let code = defReasonImports :
            toReasonTypeSource (Proxy :: Proxy Person) :
            toReasonDecoderSource (Proxy :: Proxy Person) :
  writeFile "client/" $ intercalate "\n\n" $ map unpack code

That's about it. Just do this for every type that you want to expose. You can make encoders as well, and configure various settings. See Hackage.

Reason setup

The generated Reason code needs access to @glennsl/bs-json. Get the latest install instructions from there, but at the time of writing these were:

npm install --save @glennsl/bs-json

Then add @glennsl/bs-json to bs-dependencies in your bsconfig.json:

  "bs-dependencies": ["@glennsl/bs-json"]