2016-08-22 20 views
12

Ai đó có thể giải thích tại sao mã sau đây làm cho GHC 8.0.1 lặp lại mãi mãi khi biên dịch hay là lỗi này?GHC 8.0.1 bị treo. Lỗi giải thích hoặc biên dịch?

{-# 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

Tôi không biết, nhưng tài liệu về 'TypeFamilyDependencies' khiến tôi lo sợ họ không sẵn sàng cho thời gian chính. Họ có những hạn chế không tự nhiên mà không ngồi ngay với tôi; Tôi sẽ không bị sốc nếu các nhà phát triển bỏ lỡ một điểm. – dfeuer

+1

Nếu vòng lặp mãi mãi đó chắc chắn là một lỗi – jberryman

Trả lời

3

Trình biên dịch rơi vào một vòng lặp vô hạn mà không UndecidableInstances hoặc UndecidableSuperclassCycles là một lỗi biên dịch, như jberryman stated. Bạn nên báo cáo trên trang web GHC Trac.

Tôi đã đơn giản hóa ví dụ của bạn một chút, điều này có thể hoặc không thể làm rõ mọi thứ và có thể làm báo cáo lỗi của bạn hiệu quả hơn.

{-# 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 _ _ _ =() 
Các vấn đề liên quan