[Haskell-cafe] Exponential complexity of type checking (Was:
Type-level naturals & multiplication)
Dan Doel
dan.doel at gmail.com
Wed Oct 14 05:53:18 EDT 2009
On Wednesday 14 October 2009 5:25:10 am Roel van Dijk wrote:
> With newtypes I can probably abstract even more. (newtype X a b = X (a (a
> b))
In fact, with GHC extensions, you don't need newtypes:
{-# LANGUAGE LiberalTypeSynonyms #-}
type T a = (a,a)
type X f a = f (f a)
f0 :: a -> T a
f0 x = (x,x)
f1 :: a -> X T a
f1 = f0 . f0
f2 :: a -> X (X T) a
f2 = f1 . f1
f3 :: a -> X (X (X T)) a
f3 = f2 . f2
f4 :: a -> X (X (X (X T))) a
f4 = f3 . f3
> Inferring the type of f5 also stops my machine in its tracks. But I
> *was* able to infer the type of (f4 . f4).
>
> :t (f4 . f4)
>
> (f4 . f4) :: a -> T16 (T16 a)
>
> :t f5
Yeah. Asking for the type of 'f4 . f4' doesn't seem to expand the synonyms,
while checking f5 does for some reason. I'm perplexed that having f5 defined
in the file doesn't trigger the explosion unless you declare a type (even in
terms of X and T) or ask for its type at the prompt.
-- Dan
More information about the Haskell-Cafe
mailing list