[...] wants to find all the places in a legacy codebase that a variable foo is used in the conditional of an if.
———— Why Haskell Is Worth Learning
the code I have is
import Language.C
import Data.Generics
import Control.Monad
import Text.Read
    
parseAndFindFoos :: FilePath -> IO (Either ParseError [Position])
parseAndFindFoos path = liftM (fmap findFooLocations) (parseCFilePre path)
findFooLocations input = fmap posOf (listify isIfOfInterest input)
isIfOfInterest (CIf cond _ _ _) = not (null (listify isFooIdent cond))
isFooIdent (Ident name) = (name == "foo")
how could I add an instance declaration for (Typeable Lexeme)?
{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-}
import Data.Typeable
deriving instance Typeable Lexeme
should work.
There is one pitfall, however, and this only really applies if this instance is to be defined in a library.  Lexeme will be made an instance of Typeable, and if any other library includes a similar instance, there will be a conflict.  Unfortunately, all you can really to ensure that you don't add the global Typeable instance of Lexeme is either hope it gets added to base at some point, or use a newtype wrapper and manually wrap and unwrap Lexeme.
newtype LexemeWrapper = WrapLexeme { unwrapLexeme :: Lexeme } deriving Typeable
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With