2014-06-22 25 views
6

Sau khi đọc bài viết Scrap your type classes, tôi đã triển khai lại một số ý tưởng được hiển thị. Trong khi làm điều đó tôi đã gặp một cái gì đó thực sự kỳ lạ: Loại Class-Type có thể được sử dụng như một ràng buộc loại! Câu hỏi của tôi: Tại sao vậy?Loại Loại dữ liệu

Mã của tôi:

{-# LANGUAGE Rank2Types #-} 

data IFunctor f = IFunctor { 
    _fmap :: forall a b. (a -> b) -> f a -> f b 
} 

-- this type checks... 
_fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
_fmap2 = \inst -> _fmap inst . _fmap inst 

Trong GHCi điều sau xảy ra:

>>> :t _fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
_fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b) 
     :: IFunctor f -> (a -> b) -> f (f a) -> f (f b) 
+7

Đó chỉ là lỗi. – augustss

+0

@augustss Đã được báo cáo chưa? Nếu vậy, ở đâu? – rightfold

+1

Bạn có phiên bản ghc nào? – augustss

Trả lời

1

này không hoạt động trên GHC 7.8.2. Nó đưa ra lỗi Expected a constraint, but ‘IFunctor f’ has kind ‘*’.

Phiên bản cũ của GHC có lỗi mà chúng cho phép => được sử dụng như -> trong một số trường hợp nhất định. Điều này có thể do các ràng buộc lớp kiểu nội bộ được chuyển thành các đối số dưới dạng từ điển của phương thức.

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