2012-04-30 38 views
9

Tôi gặp phải sự cố lạ khi xác định ràng buộc mặc định. Nếu một ràng buộc là đơn vị, cá thể mặc định không được chọn. Trong tất cả các trường hợp khác, nó hoạt động như mong đợi.Các loại ràng buộc mặc định được bỏ qua

{-# LANGUAGE TypeFamilies, ConstraintKinds #-} 
import qualified GHC.Exts as E 

class Expression a where 
    type Constr a v :: E.Constraint 
    --type Constr a v =()   -- with this line compilation fails 
    --type Constr a v = v ~ v  -- compiles 
    wrap :: Constr a v => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

Ai đó có thể làm rõ nguyên nhân của hành vi đánh máy?

+1

Khi đoán, vì không có kết nối nào giữa loại 'v' và ánh xạ kiểu liên kết nào sẽ giải quyết? – ivanm

+2

Có thể có liên quan: [Ràng buộcNhập và ràng buộc rỗng được liên kết mặc định] (http://comments.gmane.org/gmane.comp.lang.haskell.glasgow.user/21058) – hammar

Trả lời

4

Đây là một lỗi với giá trị mặc định loại liên kết trong 7.4 .1. Một vài tuần trước, tôi đã được nói trên #haskell rằng nó là một lỗi đã biết đã được sửa chữa, nhưng tôi không thể tìm thấy đề cập đến nó trên các dấu vết GHC.

4

Không thực sự là một câu trả lời, nhưng điều này không phải là về ConstraintKinds

class Expression a where 
    type Type a v 
    type Type a v =() 
    wrap :: (Type a v) ~() => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

không biên dịch, nhưng

class Expression a where 
    type Type a v 
    type Type a v = v 
    wrap :: (Type a v) ~ v => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

không

Các vấn đề liên quan