[Haskell-cafe] Declaring Functors for Type constrained data types

Guru Devanla gurudev.devanla at gmail.com
Tue Feb 28 03:01:14 UTC 2017


Thanks, Will.  I think adding  the constraint to the functions is a good
idea. Plus, it makes the intent clearer at the function level.



On Mon, Feb 27, 2017 at 6:02 PM, Will Yager <will.yager at gmail.com> wrote:

> 1. You could use MonoFunctor (complicated and probably not a good idea
> here) or just put the Taskable constraint on functions instead of on the
> Task definition (good and easy).
>
> So it would be
>
> data Task a = Task a deriving Functor
>
> And then put "Taskable a" on functions that require it.
>
> 2. You can't do it because it doesn't really make sense. A big part of a
> functor is that it has to be totally agnostic of what it's parametrized
> over. Otherwise you could easily violate the functor laws.
>
> Good question though, I used to wonder the same thing.
>
> cheers,
> Will
>
> On Feb 27, 2017, at 6:48 PM, Guru Devanla <gurudev.devanla at gmail.com>
> wrote:
>
> Hello All,
>
> I am working on a program that will define a bunch of tasks. Each task
> will have to implement certain methods as part of a type class.
>
> -- task 1
> data UpdateAcctsTask = UpdateAccts
>
> -- task 2
> data EmailConfig = EmaiConfig {someattrs::String}
> data SendEmailTask = SendEmailsTask EmailConfig
>
> -- task 3
> data GeneralWriterTask a = GeneralWriterTask a
>
> Each of these tasks implement a class, Taskable. The return
> values are simplified for this example.
>
> class Taskable a where
>   process :: a -> Bool
>   can_run :: a -> Bool
>
>
> This works fine. I can expand on these tasks and execute them.
>
> Now, I wanted to be able to defined dependencies between these
> (Taskable's). I decided
> I could create a data type for this dependency and may be also get a
> FreeMonad
> around this structure for further processing using a graph of Tasks. But,
> before that I wanted
> to create an wrapper for these Taskables and create a functor for it as
> follows
>
> The first thing I did was, define a Task, which generalizes over all
> the above defined (and future Taskables)
>
> data Task a where
>   Task :: (Taskable a) => a -> Task a
>
>
> instance Functor Task where
>   fmap:: (Taskable a, Taskable b) -> (a -> b) -> Task a  -> Task b    ---
> THIS DOES NOT WORK
>   fmap f (Task a) = Task $ f a
>
>
> But, I realized that I cannot define an fmap over a type constraint.
>
> My questions are:
>
> 1. Is there any way to do this. I see there is an answer of SO. I wanted
>    to make sure if there were any improvements to this since that answer'
>    was posted.
>    http://stackoverflow.com/questions/17157579/functor-
> instance-for-a-gadt-with-type-constraint
>
> 2. Secondly, I would like to know why this is not possible. Is it a current
>    limitation of GHC or if there is some fundamental category theory
> concepts
>    that dis-allows such declarations that I need to grok!
>
> Appreciate any help on this. Thank you!
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170227/e3c62835/attachment.html>


More information about the Haskell-Cafe mailing list