[Haskell-cafe] Proposal: deriving ShallowEq?

Ralf Lammel ralfla at microsoft.com
Tue Jul 19 22:49:51 EDT 2005


As Bulat points out, the GHC primitive dataToTag#
indeed nicely solves the problem. Ben, just for
completeness' sake; with SYB, you get such reflective
information too (and others):

shallowEq :: Data a => a -> a -> Bool
shallowEq x y = toConstr x == toConstr y

(dataToTag# returns Int, while toConstr comprises other things like the
constructor name.)

Regards,
Ralf

> -----Original Message-----
> From: haskell-cafe-bounces at haskell.org [mailto:haskell-cafe-
> bounces at haskell.org] On Behalf Of Bulat Ziganshin
> Sent: Tuesday, July 19, 2005 1:18 AM
> To: Ben Lippmeier
> Cc: haskell-cafe at haskell.org
> Subject: Re: [Haskell-cafe] Proposal: deriving ShallowEq?
> 
> Hello Ben,
> 
> Tuesday, July 19, 2005, 11:01:32 AM, you wrote:
> BL> I often find it useful to determine whether two objects are using
the
> BL> same constructor, without worrying about the constructors'
arguments.
> 
> BL> There is way to hack together a partial implementation of the
> ShallowEq
> BL> class within GHC, but it leaves much to be desired:
> 
> BL>  > instance Show a => ShallowEq a where
> BL>  >  (=@=) a b
> BL>  >      = (head $ words $ show a) == (head $ words $ show b)
> 
> reading GHC sources is always very interesting :)
> 
> that is from GHC/Base.hs :
> 
> %*********************************************************
> %*                                                      *
> \subsection{@getTag@}
> %*                                                      *
> %*********************************************************
> 
> Returns the 'tag' of a constructor application; this function is used
> by the deriving code for Eq, Ord and Enum.
> 
> The primitive dataToTag# requires an evaluated constructor application
> as its argument, so we provide getTag as a wrapper that performs the
> evaluation before calling dataToTag#.  We could have dataToTag#
> evaluate its argument, but we prefer to do it this way because (a)
> dataToTag# can be an inline primop if it doesn't need to do any
> evaluation, and (b) we want to expose the evaluation to the
> simplifier, because it might be possible to eliminate the evaluation
> in the case when the argument is already known to be evaluated.
> 
> \begin{code}
> {-# INLINE getTag #-}
> getTag :: a -> Int#
> getTag x = x `seq` dataToTag# x
> \end{code}
> 
> 
> 
> 
> --
> Best regards,
>  Bulat                            mailto:bulatz at HotPOP.com
> 
> 
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list