"Philip K.F. Hölzenspies"
p.k.f.holzenspies at utwente.nl
Wed Sep 9 13:15:06 EDT 2009
If you want the type checker to know what type is "inside" your
BNatural, no there isn't.
You use reverse in your example, which has type [a] -> [a], so the
type of what is in your BNatural doesn't change when you fmap reverse
onto it. In general, however, you can't guarantee this. What if you
fmap length (BNat [Bit0,Bit0]) -->> BNat 2
Obviously, this violates the declaration of BNat. In this case
specific case, you could maybe reason that the type checker should
just reduce that only [DBit] -> [DBit] functions are allowed. However,
the Functor class is set up to be more general; it allows a -> b
functions. When your data type can not be instantiated as Functor this
way, then it "isn't a functor" (at least, in the Haskell
interpretation of functor).
There is nothing to stop you from defining your own alternative map:
bmap :: ([DBit] -> [DBit]) -> BNatural -> BNatural
bmap f (BNat bs) = BNat $ f bs
I hope this makes some sense.
On Sep 9, 2009, at 6:45 PM, Serge D. Mechveliani wrote:
> I have data DBit = Bit0 | Bit1 deriving (Eq, Ord, Enum)
> data BNatural = BNat [DBit] deriving (Eq)
> and want to apply things like fmap reverse (bn :: BNatural).
> GHC reports an error on this usage of fmap.
> It also does not allow
> instance Functor BNatural where fmap f (BNat ds) = BNat $ f
> -- it reports that a type constructor for Functor must have kind * -
> > *.
> Probaly, GHC agrees with Haskell at this point (?).
> Now, I deceive the compiler by declaring instead
> newtype BNatAux a = BNat a deriving (Eq)
> type BNatural = BNatAux [DBit]
> instance Functor BNatAux where fmap f (BNat ds) = BNat $ f ds
> So, a parasitic BNatAux is introduced.
> I wonder: is there a simpler way to have fmap for BNatural ?
> Thank you in advance for advice,
> Serge Mechveliani
> mechvel at botik.ru
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
More information about the Glasgow-haskell-users