Understanding how Either is an instance of Functor

后端 未结 4 1351
暖寄归人
暖寄归人 2021-02-01 02:11

In my free time I\'m learning Haskell, so this is a beginner question.

In my readings I came across an example illustrating how Either a is made an instance

4条回答
  •  日久生厌
    2021-02-01 02:37

    Your account is right of course. Maybe the reason why we have a difficulty with instances like this is that we are really defining infinitely many functor instances at once -- one for each possible Left type. But a Functor instance is a systematic way of operating on the infinitely many types in the system. So we are defining infinitely many ways of systematically operating on the infinitely many types in the system. The instance involves generality in two ways.

    If you take it by stages, though, maybe it's not so strange. The first of these types is a longwinded version of Maybe using the unit type () and its only legitimate value ():

    data MightBe b     = Nope ()    | Yep b
    data UnlessError b = Bad String | Good b
    data ElseInt b     = Else Int   | Value b
    

    Here we might get tired and make an abstraction:

    data Unless a b    = Mere a     | Genuine b
    

    Now we make our Functor instances, unproblematically, the first looking a lot like the instance for Maybe:

    instance Functor MightBe where
      fmap f (Nope ()) = Nope ()   -- compare with Nothing
      fmap f (Yep x)   = Yep (f x) -- compare with Just (f x)
    
    instance Functor UnlessError where
      fmap f (Bad str) = Bad str   -- a more informative Nothing
      fmap f (Good x)  = Good (f x)
    
    instance Functor ElseInt where
      fmap f (Else n) = Else n 
      fmap f (Value b) = Value (f b)
    

    But, again, why bother, let's make the abstraction:

    instance Functor (Unless a) where
      fmap f (Mere a) = Mere a
      fmap f (Genuine x) = Genuine (f x)
    

    The Mere a terms aren't touched, as the (), String and Int values weren't touched.

提交回复
热议问题