howTyConApp tycon@(MkDataCon datacon_name' signature applied_types) ptrs = do
  debugM $ " Constructor " ++ (show datacon_name') ++ " , signature: " ++ (show signature) ++ ", applied: " ++ (show applied_types) ++ ", to pointers: "  ++ show ptrs
  
  io $ putStrLn " Now"
  vals <- mapM evalPtr ptrs -- [Value]  
  mapM (showValue) vals >>= debugM . show
  whnf_strings <- mapM showValue' vals -- [String]
  
  return $ let
    tycon_name = idName datacon_name'
    arg_strings = separateWithSpaces whnf_strings
    in tycon_name ++ " " ++ arg_strings
    
  where
    -- Should we wrap a value in parenthesis? Wrap the tycon apps! (iff they have applied vals)
    showValue' :: Value -> IM String
    showValue' t@(TyConApp tycon []) = return . idName . datacon_name $ tycon
    showValue' t@(TyConApp _ _) = showValue t >>= return . wrapInParenthesis
    showValue' v = showValue v

showTyConApp tycon@(MkDataCon datacon_name' signature applied_types) ptrs = do
  debugM $ " Constructor " ++ (show datacon_name') ++ " , signature: " ++ (show signature) ++ ", applied: " ++ (show applied_types) ++ ", to pointers: "  ++ show ptrs
  
  io $ putStrLn " Now"
  vals <- mapM evalPtr ptrs -- [Value]  
  mapM (showValue) vals >>= debugM . show
  whnf_strings <- mapM showValue' vals -- [String]
  
  return $ let
    tycon_name = idName datacon_name'
    arg_strings = separateWithSpaces whnf_strings
    in tycon_name ++ " " ++ arg_strings
    
  where
    -- Should we wrap a value in parenthesis? Wrap the tycon apps! (iff they have applied vals)
    showValue' :: Value -> IM String
    showValue' t@(TyConApp tycon []) = return . idName . datacon_name $ tycon
    showValue' t@(TyConApp _ _) = showValue t >>= return . wrapInParenthesis
    showValue' v = showValue v
showTyConApp tycon@(MkDataCon datacon_name' signature applied_types) ptrs = do
  debugM $ " Constructor " ++ (show datacon_name') ++ " , signature: " ++ (show signature) ++ ", applied: " ++ (show applied_types) ++ ", to pointers: "  ++ show ptrs
  
  io $ putStrLn " Now"
  vals <- mapM evalPtr ptrs -- [Value]  
  mapM (showValue) vals >>= debugM . show
  whnf_strings <- mapM showValue' vals -- [String]
  
  return $ let
    tycon_name = idName datacon_name'
    arg_strings = separateWithSpaces whnf_strings
    in tycon_name ++ " " ++ arg_strings
    
  where
    -- Should we wrap a value in parenthesis? Wrap the tycon apps! (iff they have applied vals)
    showValue' :: Value -> IM String
    showValue' t@(TyConApp tycon []) = return . idName . datacon_name $ tycon
    showValue' t@(TyConApp _ _) = showValue t >>= return . wrapInParenthesis
    showValue' v = showValue v