[GHC] #13573: Add Foldable1 / Traversable1 to base

GHC ghc-devs at haskell.org
Thu Apr 13 15:54:35 UTC 2017


#13573: Add Foldable1 / Traversable1 to base
-------------------------------------+-------------------------------------
           Reporter:  Iceland_jack   |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  #10365
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 `NonEmpty` and `Semigroup` are in ''base'' and are on our way to add
 `Semigroup` as a superclass of `Monoid` (#10365), this is a fine time to
 ask if we should include
 [https://hackage.haskell.org/package/semigroupoids-5.1/docs/Data-
 Semigroup-Foldable.html Foldable1],
 [https://hackage.haskell.org/package/semigroupoids-5.1/docs/Data-
 Semigroup-Traversable.html Traversable1] in ''base'' as well.

 `Foldable` has partial functions already, functions that only make sense
 for non-empty structures such as `foldr1`, `foldl1`, `minimum` and
 `maximum`. There are also functions which ''could'' be defined in terms of
 `Foldable` like `head` / `tail` (for definition of `unimprove` and `Diff`
 see [https://github.com/ekmett/semigroupoids/issues/49 semigroupoids issue
 #49] and this
 [https://github.com/arkeet/difference/blob/0f0e14f51cf1ecd7ebf2d8c52204bd91ae3b2969/src/Data/Semigroup/Difference.hs
 github] page)

 {{{#!hs
 minimum1 :: (Ord a, Foldable1 f) => f a -> a
 minimum1 = S.getMin . foldMap1 S.Min

 maximum1 :: (Ord a, Foldable1 f) => f a -> a
 maximum1 = S.getMax . foldMap1 S.Max

 head1 :: Foldable1 f => f a -> a
 head1 = S.getFirst . foldMap1 S.First

 last1 :: Foldable1 f => f a -> a
 last1 = S.getLast . foldMap1 S.Last

 foldr1 :: Foldable1 t => (a -> a -> a) -> (t a -> a)
 foldr1 f = unimprove . foldMap1 (\a -> Diff (f a) a)

 foldl1 :: Foldable1 t => (a -> a -> a) -> (t a -> a)
 foldl1 f = unimprove . getDual . foldMap1 (\a -> Dual $ Diff (flip f a) a)
 }}}

 There is also the possibility of adding further functions such as `foldM`,
 `foldM_`, `foldrM` and `foldlM` for non-empty structures.

 As usual I don't have more concrete ideas, but let's start by testing the
 waters before submitting a ghc-proposal. I understand this may be
 controversial

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13573>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list