[Proposal] Integration of helpers to operate on Newtypes in base
Hécate
hecate at glitchbra.in
Wed Nov 11 10:01:11 UTC 2020
Do you think that they will produce unwanted inference even with
-XTypeApplications?
Le 11/11/2020 à 08:42, David Feuer a écrit :
> For the most part, I oppose adding these to base. I'm most sympathetic
> to adding (.#) and (#.), originally from the profunctors package, as
> they seem to pop up quite a lot. For the rest, inference can be a real
> problem. coercible-utils goes to quite a lot of trouble to make these
> functions reasonably usable, but I don't think we want that sort of
> machinery in `base`.
>
> On Tue, Nov 10, 2020, 8:23 AM Hécate <hecate at glitchbra.in
> <mailto:hecate at glitchbra.in>> wrote:
>
> Hello, CLC and haskell-libraries,
>
> I am opening a proposal process to consider the integration of
> several helper functions in `base`, operating on Newtypes, and all
> based on `coerce`.
>
> My motivations are that we ought to provide a minimum set of tools
> in order to work effectively with one of our most beloved and
> ubiquitous language features.
>
> Now, these functions that I am about to present to you all do not
> come out of nowhere. They have been integrated to Kowainik's
> alternative prelude "Relude", and seem
> to have found their use amongst their users, me included.
> Their documentation can be found here =>
> https://hackage.haskell.org/package/relude-0.7.0.0/docs/Relude-Extra-Newtype.html
> <https://hackage.haskell.org/package/relude-0.7.0.0/docs/Relude-Extra-Newtype.html>
>
> but I am reproducing them below for convenience:
>
> ---
> un :: forall a n. Coercible a n => n -> a
>
> Unwraps value from newtype.
>
> ```
> >>> newtype Size = Size Int deriving Show
> >>> un @Int (Size 5)
> 5
> >>> un (Size 5) == length ['a', 'x', 'b']
> False
> ```
>
> ---
> wrap :: forall n a. Coercible a n => a -> n
>
> Wraps value to newtype. Behaves exactly as 'un' but has more
> meaningful name in case you need to convert some value to newtype.
>
> ```
> >>> newtype Flag = Flag Bool deriving (Show, Eq)
> >>> wrap False == Flag True
> False
> ```
>
> ---
> under :: forall n a. Coercible a n => (n -> n) -> a -> a
>
> Applies function to the content of newtype. This function is not
> supposed to be used on newtypes that are created with the help of
> smart constructors.
>
> ```
> >>> newtype Foo = Foo Bool deriving Show
> >>> under not (Foo True)
> Foo False
> >>> newtype Bar = Bar String deriving Show
> >>> under (filter (== 'a')) (Bar "abacaba")
> Bar "aaaa"
> ```
>
> As well as the coerced composition operator:
>
> (#.) :: Coercible b c => (b -> c) -> (a -> b) -> (a -> c)
> (#.) _f = coerce
> {-# INLINE (#.) #-}
>
> Which currently lives in
> https://hackage.haskell.org/package/base-4.14.0.0/docs/src/Data.Functor.Utils.html#%23
> <https://hackage.haskell.org/package/base-4.14.0.0/docs/src/Data.Functor.Utils.html#%23>
> but is not exported.
>
>
> Regarding the location of these functions, I either see them
> living in their own "Data.Newtype", or they could join Data.Coerce.
> I would personally create a new module as to avoid "polluting"
> Data.Coerce with non-class functions, but this is my personal
> preference.
>
>
> Thank you for reading.
>
> --
> Hécate ✨
> 🐦: @TechnoEmpress
> IRC: Uniaika
> WWW:https://glitchbra.in <https://glitchbra.in>
> RUN: BSD
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org <mailto:Libraries at haskell.org>
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> <http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries>
>
--
Hécate ✨
🐦: @TechnoEmpress
IRC: Uniaika
WWW: https://glitchbra.in
RUN: BSD
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20201111/6c14a0dc/attachment.html>
More information about the Libraries
mailing list