如何为Typeable添加实例声明

时间:2013-04-14 02:29:59

标签: haskell

  

[...]希望在遗留代码库中找到变量foo在if条件下使用的所有位置。

     

---- Why Haskell Is Worth Learning

我的代码是

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")

我如何为(Typeable Lexeme)添加实例声明?

1 个答案:

答案 0 :(得分:8)

{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving #-}
import Data.Typeable

deriving instance Typeable Lexeme

应该有用。

然而,有一个陷阱,这只适用于要在库中定义此实例的情况。 Lexeme将成为Typeable的实例,如果任何其他库包含类似的实例,则会发生冲突。不幸的是,您确实无法添加全局Typeable Lexeme实例的所有内容都希望它在某个时候被添加到base,或者使用{{1包装器并手动包装和展开newtype

Lexeme