2014-09-16 24 views
9

Tôi đã tìm thấy một tình huống thú vị, khi sử dụng các loại dữ liệu với họ loại.Các ứng dụng gia đình kiểu Haskell không được đánh giá

Thông báo lỗi của trình biên dịch là No instance for (C (ID())) arising from a use of W. Nó cho thấy rằng một ứng dụng gia đình kiểu không được đánh giá đầy đủ, ngay cả khi nó được bão hòa. :kind! ID() đánh giá là (), vì vậy theo trường hợp C() nên được sử dụng.

{-# LANGUAGE GADTs, TypeFamilies, UndecidableInstances, FlexibleContexts #-} 

type family ID t where 
    ID t = t 

class C t where 
instance C() where 

data W where 
    W :: C (AppID t) => P t -> W 

type family AppID t where 
    AppID t = (ConstID t)() 

type family ConstID t where 
    ConstID t = ID 

data P t where 
    P :: P t 

data A 

w :: W 
w = W (P :: P A) 

Tôi bằng cách nào đó có thể buộc đánh giá là ID()? Đó có phải là lỗi trình biên dịch không?

Tôi đang sử dụng GHC 7.8.3

+0

(ID) đánh giá như thế nào? Không có trường hợp nào cho họ ID. – augustss

+0

Tôi đã viết nó như là một loại hình gia đình khép kín (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Viết nó như một gia đình kiểu bình thường không thay đổi lỗi. –

Trả lời

2

Sự cố là loại ConstID.

type family ConstID t a where 
    ConstID t a = ID a 
Các vấn đề liên quan