Thanks, Ed. It hadn't occurred to me that defunctionalization might be useful for monomorphization. Do you know of a connection?
I'm using a perfect leaf tree type similar to the one you mentioned but indexed by depth:
> data Tree :: (* -> *) -> Nat -> * -> * where
> L :: a -> Tree k 0 a
> B :: Tree k n (k a) -> Tree k (1+n) a
Similarly for "top-down" perfect leaf trees:
> data Tree :: (* -> *) -> Nat -> * -> * where
> L :: a -> Tree k 0 a
> B :: k (Tree k n a) -> Tree k (1+n) a
This way, after monomorphization, there won't be any sums remaining.
-- ConalOn Thu, Jun 19, 2014 at 1:22 PM, Edward Kmett <ekmett@gmail.com> wrote:
Might you have more success with a Reynolds style defunctionalization pass for the polymorphic recursion you can't eliminate?Then you wouldn't have to rule out things like
data Complete a = S (Complete (a,a)) | Z awhich don't pass that test.-EdwardOn Thu, Jun 19, 2014 at 3:28 PM, Conal Elliott <conal@conal.net> wrote:_______________________________________________Has anyone worked on a monomorphizing transformation for GHC Core? I understand that polymorphic recursion presents a challenge, and I do indeed want to work with polymorphic recursion but only on types for which the recursion bottoms out statically (i.e., each recursive call is on a smaller type). I'm aiming at writing high-level polymorphic code and generating monomorphic code on unboxed values. This work is part of a project for compiling Haskell to hardware, described on my blog (http://conal.net).Thanks, - Conal
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users