2013-04-14 113 views
4

想要找到遺留代碼庫中的所有位置,以便在if條件下使用變量foo。如何添加類型實例聲明

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

我怎麼能添加對(分型詞位)的實例聲明?

回答

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

deriving instance Typeable Lexeme 

應該工作。

然而,有一個缺陷,這隻有當這個實例要在庫中定義時才真正適用。 Lexeme將作爲Typeable的實例,並且如果任何其他庫包含類似實例,則會有衝突。不幸的是,你真的可以確保你不添加Lexeme的全局Typeable實例,或者希望它在某個時刻被添加到base,或者使用newtype包裝並手動包裝和解包Lexeme

newtype LexemeWrapper = WrapLexeme { unwrapLexeme :: Lexeme } deriving Typeable