Как сбросить выход упрощенного GHC в удобочитаемой форме?

У меня есть следующая программа:

data Peano = Zero | Succ Peano deriving (Show)

add Zero     b = b
add (Succ a) b = add a (Succ b)

mul Zero     b = Zero
mul (Succ a) b = add b (mul a b)

four x = let two = Succ (Succ Zero) in mul two two

Я хочу получить что-то подобное от GHC:

add =
  \ ds b ->
    case ds of
      Zero ->
        b
      Succ a ->
        add
          a
          (Succ b)

mul =
  \ ds b ->
    case ds of 
      Zero ->
        Zero
      Succ a ->
        add
          b
          (mul a b)

four =
    let
      two =
        Succ
           (Succ Zero)
    in
    mul two two

Лучшее, что мне удалось получить, -

ghci -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques foo.hs

но эта сталь потребовала много ручного удаления сгенерированных материалов GHC, чтобы получить код выше. Есть ли переключатель для GHC или стороннего script, который выполняет очистку?

Есть ли способ, по крайней мере, избавиться от case {tick (main:Main, 8)} @ (State# RealWorld) of _ { __DEFAULT ->?

Ответ 1

Вам повезло! Существует инструмент для работы: ghc-core.

ghc-core обертывает ghc оболочкой командной строки, которая отображает GHC-оптимизированное ядро ​​и сборку в понятном для пользователя цвете в пейджере.

Использование - просто замените ghc на ghc-core:

   ghc-core A.hs  

   ghc-core -fvia-C -optc-O3 A.hs