# [Haskell-cafe] automatically deriving Map and Filter on datatypes etc.

Miguel Mitrofanov miguelimo38 at yandex.ru
Thu Jun 5 04:49:06 EDT 2008

```It can be even worse:

data X a b = X (X b a -> b)

Here (X a) is certainly a functor, but the implementation must also
act on "a" contravariantly:

mapX :: (a -> a') -> X a' b -> X a b
mapX f (X h) = X \$ h . fmap f
instance Functor (X a) where fmap f (X h) = X \$ f . h . mapX f

On 5 Jun 2008, at 12:39, Thomas Davie wrote:

> Even deriving an instance of Functor seems rather implausable, what
> should it do for
>
> data Wierd a b = Nil | A a (Wierd a b) | B b (Wierd a b)
>
> Should fmap's function argument operate on 'a's, 'b's, or both?
>
> Bob
>
> On 5 Jun 2008, at 10:28, Miguel Mitrofanov wrote:
>
>> Well, it's certainly not possible for "filter", at least, not
>> without additional hints to the compiler. For example, consider
>> this type:
>>
>> data Weird a = A | B a (Weird a) (Weird a)
>>
>> filter p A = A
>> filter p (B x w1 w2) | p x = B x (filter p w1) (filter p w2)
>>                    | otherwise = ?????
>>
>> On 5 Jun 2008, at 12:03, Cetin Sert wrote:
>>
>>> Hi ^_^,
>>>
>>> Let's say we have the following data type and functions:
>>> data Tab a =      (:↺:)
>>>
>>>          |     a :↓:   Tab a
>>>          | Tab a :↙↘: (Tab a,Tab a)
>>>
>>> map f (:↺:)          = (:↺:)
>>> map f (a :↓: t)      = f a :↓: map f t
>>> map f (h :↙↘: (l,r)) = map f h :↙↘: (map f l, map f r)
>>>
>>>
>>> filter p (:↺:)          = (:↺:)
>>> filter p (a :↓: t)      | p a       = filter p t
>>>                       | otherwise = a :↓: filter p t
>>> filter p (h :↙↘: (l,r)) = filter p h :↙↘: (filter p l,
>>> filter p r)
>>>
>>> is it possible to automatically derive map and filter?
>>> data Tab a =      (:↺:)
>>>          |     a :↓:   Tab a
>>>          | Tab a :↙↘: (Tab a,Tab a)
>>>          deriving (Eq, Show, Read, Map, Filter)
>>>
>>> If not, do you think it might be nice to have something like this
>>> in the future?
>>>
>>> Best Regards,
>>> Cetin Sert
>>> _______________________________________________
>>
>> _______________________________________________