[Haskell-cafe] Announcement: Bang, a drum DSL for Haskell
bertram.felgenhauer at googlemail.com
Wed Jun 11 19:30:58 UTC 2014
Tom Ellis wrote:
> On Wed, Jun 11, 2014 at 01:25:48AM +0200, Bertram Felgenhauer wrote:
> > begin cont = cont (return ())
> > a m cont = cont (m >> putStrLn "a")
> > b m cont = cont (m >> putStrLn "b")
> > c m cont = cont (m >> putStrLn "c")
> > end m = m
> > main = begin a b c a b a end
> This is fantastic!
Unfortunately this causes performance problems with ghc's type
main = begin a a a a a a a a a a a a a a a a a end
takes more than a second to type-check under ghc 7.8.2, and every
additional 'a' adds a factor of two. Interestingly, ghc 7.6.3 does
not show this behaviour.
Note that the instantiated types of 'a' grow exponentially:
The first 'a' in 'begin a end' and 'begin a a end' have types
M -> (M -> M) -> M
M -> (M -> (M -> M) -> M) -> (M -> M) -> M
respectively, where 'M' abbreviates IO (), and each additional 'a'
turns M -> r into M -> (M -> r) -> r, doubling the type's size.
P.S. a related way for causing bad type checking performance is
the innocent looking
main = id id id id id id id id id id id
id id id id id id id id id id id (return ())
where again, the type of the first 'id' grows exponentially in
the number of 'id' calls. In this case, ghc-7.6.3 performs just
as badly as ghc-7.8.2.
More information about the Haskell-Cafe