equal [x, y]     = do
  primitiveEquals <- liftM or $ mapM (unpackEquals x y)
                     [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
  --eqvEquals <- eqv [x, y]
  --return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
  Bool x' <- eqv [x, y]
  return $ Bool $ (primitiveEquals || x')
equal [x, y]     = do
  primitiveEquals <- liftM or $ mapM (unpackEquals x y)
                     [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
  --eqvEquals <- eqv [x, y]
  --return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
  Bool x' <- eqv [x, y]
  return $ Bool $ (primitiveEquals || x')
equal [x, y]     = do
  primitiveEquals <- liftM or $ mapM (unpackEquals x y)
                     [AnyUnpacker unpackNum, AnyUnpacker unpackStr, AnyUnpacker unpackBool]
  --eqvEquals <- eqv [x, y]
  --return $ Bool $ (primitiveEquals || let (Bool x) = eqvEquals in x)
  Bool x' <- eqv [x, y]
  return $ Bool $ (primitiveEquals || x')