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 _ _ _ =() 
関連する問題