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)
Đó chỉ là lỗi. – augustss
@augustss Đã được báo cáo chưa? Nếu vậy, ở đâu? – rightfold
Bạn có phiên bản ghc nào? – augustss