Hello. I think I've come across a GHCi bug. Using the following module, GHCi version 5.04.2 segfaults, apparently trying to compute a type using functional dependencies. The segfault happens when I try to calculate (v1 .> v2). I tried the code on Hugs, and it answers Main> v1 .> v2 V [] :: PSOp (Pop a Id) as expected. I think the problem is occuring in the line
instance Reverse a b c => CheckPS Id a b c
because if I remove the line
instance Reverse a (Pop t b) c => Reverse (Pop t a) b c
instead of segfaulting, GHCi rightfully complains: <interactive>:1: No instance for (Reverse (Pop a Id) Id c) arising from use of `.>' at <interactive>:1 In the definition of `it': v1 .> v2 GHC compiles the program just fine and runs it without any issues. I installed GHC 5.04.2 using the RedHat 8.0 RPM's. If there's any important information you may need from me, please, tell me and I will be glad to help. I've also cross-posted this to the bug section at sourceforge.net, and there the module file can be found as a separate file. Thank you, Carlos --------------------------------------------------------------------------------
class ComposePS a b c | a b -> c where (.>) :: PSOp a -> PSOp b -> PSOp c (V a) .> (V b) = V (a ++ b)
instance (ConcatPS a b c, CheckPS c Id Id d) => ComposePS a b d
--------------------------------------------------------------------------------
data PSOp a = V [String] deriving Show
data Id data Push t rest data Pop t rest
class Reverse a b c | a b -> c instance Reverse Id b b instance Reverse a (Pop t b) c => Reverse (Pop t a) b c instance Reverse a (Push t b) c => Reverse (Push t a) b c
--------------------------------------------------------------------------------
class ConcatPS a b c | a b -> c where ccat :: a -> b -> c instance ConcatPS Id a a instance ConcatPS a b c => ConcatPS (Pop t a) b (Pop t c) instance ConcatPS a b c => ConcatPS (Push t a) b (Push t c)
--------------------------------------------------------------------------------
class CheckPS a b c d | a b c -> d where check :: a -> b -> c -> d check _ _ _ = error "oki"
instance Reverse a b c => CheckPS Id a b c
-- instance CheckPS a b (Push t c) d => CheckPS (Push t a) b c d
instance CheckPS a (Pop t b) Id d => CheckPS (Pop t a) b Id d
-- instance CheckPS a b c d => CheckPS (Pop t a) b (Push t c) d -- instance (SameType t1 t2, CheckPS a b c d) => CheckPS (Pop t1 a) b (Push t2 c) d
u = undefined
v1 :: PSOp (Pop a Id) v1 = V []
v2 :: PSOp Id v2 = V []