Hey Matt,

cool idea! Also it looks like such a tool could 'solve' stream fusion: https://ghc.haskell.org/trac/ghc/ticket/915#comment:52

Greetings
Sebastian

2018-02-27 18:01 GMT+01:00 Joachim Breitner <mail@joachim-breitner.de>:
Hi,

something like this would be great. I don’t have a sense yet of what
“something” should be like.


Am Dienstag, den 27.02.2018, 09:59 +0000 schrieb Matthew Pickering:
> To go back to the power example, the recursive
> condition would have to be an inductively defined natural (data N = Z
> | S N) rather than an Int as the comparison operator for integers
> can't be evaluated by the optimiser.

Sure they can:

$ cat ConstantFolding.hs
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fplugin=Test.Inspection.Plugin #-}
module ConstantFolding where

import Test.Inspection

ltInt :: Bool
ltInt = (3::Int) > 2

ltInteger :: Bool
ltInteger = (3::Integer) > 2

true :: Bool
true = True


inspect $ 'ltInt === 'true
inspect $ 'ltInteger === 'true

$ ghc -O ConstantFolding.hs
[1 of 1] Compiling ConstantFolding  ( ConstantFolding.hs,
ConstantFolding.o )
ConstantFolding.hs:17:1: ltInt === true passed.
ConstantFolding.hs:18:1: ltInteger === true passed.
inspection testing successful
      expected successes: 2



As  an alternative with a maybe simpler user interface (and probably
less power), I wonder if we can create a magic function
> compileTimeWHNF :: a -> a
or
> compileTimeNF :: a -> a
and a GHC core plugin (or eventually built-in thing) that finds these
magic functions and evaluates their arguments, using the simplifier.


Cheers,
Joachim

--
Joachim Breitner
  mail@joachim-breitner.de
  http://www.joachim-breitner.de/

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs