2013-09-25 43 views
2

我想使用自定義的限制,以幫助遏制組合爆炸:ConstraintKind不一致?

{-# LANGUAGE ConstraintKinds #-} 
{-# LANGUAGE MultiParamTypeClasses #-} 

class DifferentTypes a b 
type DifferentTypes3 a b c = (DifferentTypes a b, DifferentTypes b c, DifferentTypes a c) 

當我使用我的自定義約束,該代碼不能通過編譯:

class Foo a 
class Bar a 
instance (DifferentTypes3 a b c, Bar a, Bar b, Bar c) => Foo (a, b, c) 

但是,當我代替手工寫出來我的約束,它編譯:

class Foo a 
class Bar a 
instance (DifferentTypes a b, DifferentTypes b c, DifferentTypes a c, Bar a, Bar b, Bar c) => Foo (a, b, c) 

這是一個錯誤,還是我錯過了什麼?

+2

您需要爲此啓用「UndecidableInstances」。約束會比您期望的更晚。 – Satvik

+2

儘管'UndecidableInstances'似乎是一個解決方法,我會稱這是一個錯誤。 –

+1

感謝信息傢伙。我在這裏提交了一個bug http://ghc.haskell.org/trac/ghc/ticket/8359 –

回答

0

隨着GHC ticket #8359固定,您原來的代碼(使用ConstraintKinds)現在typechecks按預期沒有UndecidableInstances