2012-11-24 20 views
6

से this question के अनुसार 2 functor कानून हास्केल में 1 से गर्भित है:हास्केल पहले functor कानून दूसरा

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

रिवर्स सच है? दूसरे कानून से शुरू करना, और gid के बराबर सेट करना, क्या मैं निम्न कारणों का कारण बन सकता हूं और पहला कानून प्राप्त कर सकता हूं?

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

जहां x' = fmap h x

उत्तर

11

नहीं

data Break a = Yes | No 

instance Functor Break where 
    fmap f _ = No 

स्पष्ट रूप से दूसरे नियम

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

रखती है लेकिन, पहले कानून नहीं है। आपके तर्क के साथ समस्या सभी x' फॉर्म fmap f x

7

नहीं, यह केवल एक दिशा में काम करता है।

data Foo a = Foo Int a 

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

यह दूसरा नियम नहीं बल्कि पहले एक को संतुष्ट करता है:

इस Functor उदाहरण पर विचार करें।

अपने सबूत में अंतिम चरण अमान्य है - आप से पता चला कि fmap id x' = x', लेकिन इस x' कि मनमाने ढंग से मूल्यों पहली जगह में fmap से लौटाए जाते हैं, नहीं करने के लिए प्रतिबंधित है।