2016-08-22 59 views
12

有人可以解釋爲什麼下面的代碼會導致GHC 8.0.1在編譯時永遠循環,或者這是一個錯誤嗎?GHC 8.0.1掛起。解釋或編譯器錯誤?

{-# LANGUAGE TypeFamilyDependencies #-} 
{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE AllowAmbiguousTypes #-} 

main = return $ f (Just 'c') 

data D1 x 
data D2 

type family TF x = t | t -> x 
type instance TF (D1 x, a) = Maybe (TF (x, a)) 
type instance TF (D2,()) = Char 

f :: TF (x, a) ->() 
f _ =() 
+3

我不知道,但'TypeFamilyDependencies'的文檔讓我擔心他們還沒有準備好黃金時段。他們有不自然的限制,不能與我坐在一起;如果開發商錯過了一席之地,我不會感到震驚。 – dfeuer

+1

如果它永遠循環,那絕對是一個錯誤 – jberryman

回答

3

編譯器落入一個無限循環而不UndecidableInstancesUndecidableSuperclassCycles是編譯器故障,如jberryman stated。您應該在GHC Trac網站上報告。

我簡化了您的示例,這可能會或可能不會澄清事情,並可能會使您的錯誤報告更有效。

{-# LANGUAGE TypeFamilyDependencies #-} 

module TFLoop where 

import Data.Proxy 

main :: IO() 
main = return $ f Proxy Proxy (Just 'c') 

data D1 x 
data D2 

type family TF d a = t | t -> d a 
type instance TF (D1 x) a = Maybe (TF x a) 
type instance TF D2() = Char 

f :: proxy1 x -> proxy2 a -> TF x a ->() 
f _ _ _ =()