
Yes, when *inferring* types GHC defers context reduction as long as possible. Reason: the call site of the function may "see" more instance declarations (e.g. in particular, overlapping ones), so doing reduction later may yield a different answer. When checking the inferred type against a programmer-supplied type signature, none of this applies; GHC looks for a proof "on the spot" that the inferred constraints are derivable from the signature. Simon | -----Original Message----- | From: glasgow-haskell-users-bounces@haskell.org [mailto:glasgow-haskell-users- | bounces@haskell.org] On Behalf Of Tomasz Zielonka | Sent: 12 August 2004 21:44 | To: GHC-users | Subject: Lazy type-class resolution | | Hello! | | Recently I was trying to write a variadic function composition operator in | Haskell. I managed to produce a version with such an interface: | | runF (compose f1 f2 f3 ... fn) == f1 . f2 . f3 . ... . fn | | I believe it is impossible to remove 'runF' without loosing generality | and introducing ambiguities. | | But that's not my question. I noticed that Hugs can instantly infer the nice | type for result of composition, but GHC keeps the huge typeclass context to | the last moment. | | __ __ __ __ ____ ___ _________________________________________ | || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard | ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2003 | ||---|| ___|| World Wide Web: http://haskell.org/hugs | || || Report bugs to: hugs-bugs@haskell.org | || || Version: November 2003 _________________________________________ | | Hugs mode: Restart with command line option +98 for Haskell 98 mode | | Type :? for help | Prelude> :l Comp | Comp> :t runF (compose succ (+ 1) succ read) | runF (compose succ (flip (+) 1) succ read) :: (Num a, Enum a, Read a) => [Char] -> a | Comp> :t runF (compose id id id id) | runF (compose id id id id) :: a -> a | | ___ ___ _ | / _ \ /\ /\/ __(_) | / /_\// /_/ / / | | GHC Interactive, version 6.2.1, for Haskell 98. | / /_\\/ __ / /___| | http://www.haskell.org/ghc/ | \____/\/ /_/\____/|_| Type :? for help. | | Loading package base ... linking ... done. | Prelude> :l Comp | Compiling Comp ( Comp.hs, interpreted ) | Ok, modules loaded: Comp. | *Comp> :t runF (compose succ (+ 1) succ read) | runF (compose succ (+ 1) succ read) :: | forall a b a1 a2 a3 a4. | (MkComp (a1 -> a1) | ((a2 -> a2) | -> (a3 -> a3) -> (String -> a4) -> F a b), | Enum a1, | Num a2, | Enum a3, | Read a4) => | a -> b | *Comp> runF (compose succ (+ 1) succ read) "13123" :: Int | 13126 | *Comp> :t runF (compose id id id id) | runF (compose id id id id) :: | forall a b a1 a2 a3 a4. | (MkComp (a1 -> a1) ((a2 -> a2) -> (a3 -> a3) -> (a4 -> a4) -> F a b)) => | a -> b | *Comp> let f = runF (compose id id id id) | *Comp> :t f | f :: forall b. b -> b | | Is this a known feature of GHC ? | | Best regards, | Tom | | -- | .signature: Too many levels of symbolic links | _______________________________________________ | Glasgow-haskell-users mailing list | Glasgow-haskell-users@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users