2016-08-22 6 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

UndecidableInstances 또는 UndecidableSuperclassCycles없이 무한 루프에 빠지는 컴파일러 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 _ _ _ =()