2013-04-17 30 views
10

Tôi đang cố gắng tìm hiểu xem có thể (và cách) để xác định các phiên bản lớp cho các từ đồng nghĩa loại nhiều tham số.Trường hợp đồng nghĩa loại nhiều tham số

Ví dụ:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-} 

type F a b = a -> b 
data DF a b = DF (a -> b) 

class C c a b where 
    doc :: c a b -> a -> b 

Nó hoạt động cho một loại đa param dụ:

instance C DF a b where 
    doc (DF f) x = f x 

Nhưng nó không hoạt động cho loại từ đồng nghĩa:

-- ERROR: 
-- 
-- Type synonym `F' should have 2 arguments, but has been given none 
-- In the instance declaration for `C F a b' 
-- 
instance C F a b where 
    doc f x = f x 

Có có thể xác định thể hiện loại lớp cho F?

Trả lời

14

Không thể viết được. Loại từ đồng nghĩa nói chung phải được áp dụng đầy đủ để sử dụng chúng, đặc biệt là as a type class parameter.

Lưu ý rằng nếu bạn có thể eta-giảm loại từ đồng nghĩa đủ một thể hiện là có thể; đó là từ đồng nghĩa phải được áp dụng đầy đủ, không phải là loại nó đề cập đến. Vì vậy, đây sẽ làm việc:

type F = (->) 

instance C F a b where 
    doc f x = f x 

a LiberalTypeSynonyms extension that relaxes some of the rules về mở rộng đồng nghĩa loại, nhưng nó không giúp ở đây - nó chỉ cho phép bạn làm những việc như đưa ra một loại từ đồng nghĩa một phần-áp dụng như một tham số kiểu loại khác từ đồng nghĩa. Mọi thứ vẫn phải được mở rộng hoàn toàn để sử dụng nếu không.

Để xem lý do tại sao hạn chế này là cần thiết, xem xét các loại từ đồng nghĩa sau đây:

type Flip f a b = f b a 

Và trường hợp sau đây:

instance Functor (Flip Either a) where 
    fmap _ (Right x) = Right x 
    fmap f (Left x) = Left (f x) 

Nhớ lại rằng có cũng là một ví dụ Functor (Either a) mà không giống nhau điều, ngoại trừ được nhân đôi. Cả hai trường hợp này đều hợp lý với Functor trường hợp.

Lưu ý rằng không giống như newtype, nhập từ đồng nghĩa được coi giống như loại mà chúng đề cập đến, giá trị của biểu thức fmap not (Right True :: Either Bool Bool) là gì?

3

Loại từ đồng nghĩa phải được áp dụng đầy đủ cho một cá thể để có thể được xác định cho chúng. Loại F không phải là * -> * -> *, như người ta có thể mong đợi, nhưng thay vì không hợp lệ cho đến khi hai đối số kiểu khác được cung cấp. Hãy thử số điện thoại

type F = (->) 

thay thế.

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