2012-11-24 26 views
6

Theo this question luật functor 2 được ngụ ý bởi 1 trong Haskell:Haskell Luật functor đầu tiên từ Thứ hai

1st Law: fmap id = id 
2nd Law : fmap (g . h) = (fmap g) . (fmap h) 

là sự thật ngược lại? Bắt đầu từ luật thứ 2 và đặt g bằng id, tôi có thể giải thích lý do sau và nhận được luật thứ nhất không?

fmap (id . h) x = (fmap id) . (fmap h) x 
fmap h x = (fmap id) . (fmap h) x 
x' = (fmap id) x' 
fmap id = id 

nơi x' = fmap h x

Trả lời

11

Không

data Break a = Yes | No 

instance Functor Break where 
    fmap f _ = No 

rõ luật thứ hai giữ

fmap (f . g) = const No = const No . fmap g = fmap f . fmap g 

nhưng, luật đầu tiên thì không. Vấn đề với đối số của bạn không phải là tất cả x' có dạng fmap f x

7

Không, nó chỉ hoạt động theo một hướng.

Cân nhắc Functor trường hợp này:

data Foo a = Foo Int a 

instance Functor Foo where 
    fmap f (Foo _ x) = Foo 5 (f x) 

Nó đáp ứng các luật thứ hai nhưng không phải là người đầu tiên.

Bước cuối cùng trong bằng chứng của bạn không hợp lệ - bạn đã chỉ ra rằng fmap id x' = x', nhưng điều này chỉ giới hạn x' s được trả về từ fmap ở nơi đầu tiên, chứ không phải giá trị tùy ý.

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