[Haskell-beginners] How to make instance of MonoFunctor

Michael Snoyman michael at snoyman.com
Thu Aug 10 08:58:04 UTC 2017


What do you want the type of `omap` to be for `UserName`? There are two
reasonable definitions:

omap :: (Text -> Text) -> (UserName -> UserName)
omap :: (Char -> Char) -> (UserName -> UserName)

The first one is saying that a UserName is a container of a single Text
value. The second is that a UserName is a container of a sequence of Char
values. Once you figure out what the answer to this question is, you'll
need to use an associated type called Element to specify what you intend,
e.g.:

type Element UserName = Char

On Thu, Aug 10, 2017 at 11:35 AM, Baa <aquagnu at gmail.com> wrote:

> Hello, Dear List!
>
> I want to make functor of my type like
>
>   newtype UserName = UserName { unName :: Text }
>
> sure, it's impossible, so I will make MonoFunctor instead of (from
> library mono-traversable). So, I try:
>
>   instance MonoFunctor UserName where
>     omap fn (UserName n) = UserName $ fn $ n
>
> but I get error
>
>         • Couldn't match expected type ‘Element UserName’
>                       with actual type ‘Text’
>         • In the second argument of ‘($)’, namely ‘unName an’
>           In the second argument of ‘($)’, namely ‘fn $ unName an’
>           In the expression: UserName $ fn $ unName an
>
> interesting is that Text "type Element Text" of "type family Element
> mono" (instance?). So, how to make mono-functor for such `UserName`
> structure?
>
>
> --
> Best regards, Paul
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20170810/b45d143e/attachment.html>


More information about the Beginners mailing list