Re: Generalize indexing function
George Wilson <[email protected]>
| Newsgroups | gmane.comp.lang.haskell.libraries |
|---|---|
| Message-ID | <CABzzMaxqWyQerwyE7jz372_3PuAnM3KwsGajEdQ-ffXRM0W5AA@mail.gmail.com> |
Does this class have any laws? From what I can tell, this is useful only as an overloading of some identifiers - I don't see what useful functions I could write in terms of this as an abstraction. Cheers, George On Sun, 11 Apr 2021, 08:49 Dannyu NDos, <[email protected]> wrote: > I noticed that the list indexing function, (!!), is generalizable. I'm > showing some instances: > > {-# LANGUAGE MultiParamTypeClasses #-} > > import Data.Complex > import Data.Functor.Compose > import Data.Functor.Product > import Data.Functor.Sum > import Data.List.NonEmpty > import Data.Maybe > > infix 9 !? > infixl 9 ! > > class Indexable i a where > (!?) :: i b -> a -> Maybe b > > (!) :: Indexable i a => i b -> a -> b > x ! n = fromJust (x !? n) > > instance Indexable [] Int where > [] !? _ = Nothing > (x:_) !? 0 = Just x > (_:xs) !? n > | n < 0 = Nothing > | otherwise = xs !? (n-1) > > instance Indexable ((->) a) (Identity a) where > f !? Identity n = Just (f n) > > instance Indexable ((,) a) () where > (_,x) !? _ = Just x > > instance Indexable Complex Bool where > (x :+ _) !? False = Just x > (_ :+ y) !? True = Just y > > instance (Indexable f a, Indexable g b) => Indexable (Compose f g) (a,b) > where > Compose z !? (m,n) = do > y <- z !? m > y !? n > > instance (Indexable f a, Indexable g b) => Indexable (Product f g) (Either > a b) where > Pair x _ !? Left m = x !? m > Pair _ y !? Right n = y !? n > > instance (Indexable f a, Indexable g a) => Indexable (Sum f g) (Identity > a) where > InL x !? Identity n = x !? n > InR y !? Identity n = y !? n > > instance Indexable NonEmpty Int where > (x :| xs) !? n = (x : xs) !? n > > > _______________________________________________ > Libraries mailing list > [email protected] > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries > _______________________________________________ Libraries mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries