very strange behavior (crashes!) with Dynamics

Hal Daume t-hald at microsoft.com
Thu Aug 14 19:47:28 EDT 2003


Okay, I know I promised that was the last one, but you can actually get
it simpler.  Remove all the dynamic map stuff.  Just have two files,
Range.hs and Coref.hs, with:

module Range where

import Data.Dynamic

data Range = Single Int
           | Range  Int Int
           deriving (Eq, Ord, Show)

rangeTypeCon = mkTyCon "Range" ; rangeTypeRep = mkAppTy rangeTypeCon []
instance Typeable Range where typeOf _ = rangeTypeRep
{-# NOINLINE rangeTypeCon #-}
{-# NOINLINE rangeTypeRep #-}

rangeDShow :: DShow
rangeDShow = dshowLabel (shows :: Range -> ShowS)

type DShow = Dynamic -> Maybe ShowS

dshowLabel :: Typeable a => (a -> ShowS) -> DShow
dshowLabel x d = 
  case fromDynamic d of
    Nothing -> Nothing
    Just v  -> Just (shows (typeOf v) . showChar '=' . x v)



and



module Coref where

import Data.Dynamic
import Range

data Coref = Coref Int Int Bool (Maybe String) 
         deriving (Eq, Ord, Show)

corefTypeCon = mkTyCon "Coref" ; corefTypeRep = mkAppTy corefTypeCon []
instance Typeable Coref where typeOf _ = corefTypeRep
{-# NOINLINE corefTypeCon #-}
{-# NOINLINE corefTypeRep #-}

corefDShow = dshowLabel (shows :: Coref -> ShowS)



now load Coref, do 'Monad.liftM ($"") (corefDShow (toDyn (Range 1 1)))'
which works fine (returns Nothing), then touch it and reload it and do
the same thing and you'll crash.

 --
 Hal Daume III                                   | hdaume at isi.edu
 "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume


> -----Original Message-----
> From: glasgow-haskell-bugs-admin at haskell.org 
> [mailto:glasgow-haskell-bugs-admin at haskell.org] On Behalf Of Hal Daume
> Sent: Thursday, August 14, 2003 4:06 PM
> To: Hal Daume; glasgow-haskell-bugs at haskell.org
> Subject: RE: very strange behavior (crashes!) with Dynamics
> 
> 
> Okay, this is the last spam from me.
> 
> Here's exactly what you need to do to get the bug.
> 
> Create three modules, DynamicMap.hs, Range.hs and Coref.hs, containing
> the following:
> 
> ------------ DynamicMap.hs ------------
> module DynamicMap
>     ( DynamicMap,
>       emptyDM,
>       addToDM,
>       foldDM
>     )
>     where
> 
> import Data.FiniteMap
> import Data.Dynamic
> 
> type DynamicMap = FiniteMap String Dynamic  -- cuz TypeRep 
> \not \in Ord
> :(
> 
> stypeOf x = show (typeOf x)
> 
> emptyDM :: DynamicMap
> emptyDM = emptyFM
> 
> addToDM :: Typeable a => DynamicMap -> a -> DynamicMap
> addToDM dm a = addToFM dm (stypeOf a) (toDyn a)
> 
> foldDM :: (Dynamic -> b -> b) -> b -> DynamicMap -> b
> foldDM f = foldFM (const f)
> 
> 
> -------------- Range.hs ---------------
> module Range where
> 
> import Data.Dynamic
> 
> data Range = Single Int
>            | Range  Int Int
> 
> minRange (Single x) = x
> minRange (Range x _) = x
> 
> maxRange (Single x) = x
> maxRange (Range _ x) = x
> 
> instance Show Range where
>   showsPrec _ (Single i) = shows i
>   showsPrec _ (Range i j) = shows i . showChar '^' . shows j
> 
> instance Eq Range where
>     Single i == Single k = i == k
>     Single i == Range k l = i == k && k == l
>     Range i j == Range k l = i == k && j == l
>     Range i j == Single k = i == k && j == k
> 
> instance Read Range where
>   readsPrec i s
>       | '^' `elem` s = 
>           let n1 = takeWhile (/='^') s
>               n2 = drop (length n1+1) s
>           in  [(Range l h, rest) | (l,[]) <- readsPrec i n1, 
> (h,rest) <-
> readsPrec i n2]
>       | otherwise = map (\ (a,s) -> (Single a,s)) (readsPrec i s)
> 
> instance Ord Range where
>     r `compare` s = case minRange r `compare` minRange s of
>                       EQ -> maxRange r `compare` maxRange s
>                       x  -> x
> 
> rangeTypeCon = mkTyCon "Range" ; rangeTypeRep = mkAppTy 
> rangeTypeCon []
> instance Typeable Range where typeOf _ = rangeTypeRep
> {-# NOINLINE rangeTypeCon #-}
> {-# NOINLINE rangeTypeRep #-}
> 
> rangeDShow :: DShow
> rangeDShow = dshowLabel (shows :: Range -> ShowS)
> 
> type DShow = Dynamic -> Maybe ShowS
> 
> dshow0 :: DShow
> dshow0 = const Nothing
> 
> dshowLabel :: Typeable a => (a -> ShowS) -> DShow
> dshowLabel x d = 
>   case fromDynamic d of
>     Nothing -> Nothing
>     Just v  -> Just (shows (typeOf v) . showChar '=' . x v)
> 
> 
> -------------- Coref.hs ---------------
> module Coref where
> 
> import DynamicMap
> import Data.Dynamic
> import Range
> 
> data Coref = Coref Int Int Bool (Maybe String) 
>          deriving (Eq, Ord, Show)
> 
> corefTypeCon = mkTyCon "Coref" ; corefTypeRep = mkAppTy 
> corefTypeCon []
> instance Typeable Coref where typeOf _ = corefTypeRep
> {-# NOINLINE corefTypeCon #-}
> {-# NOINLINE corefTypeRep #-}
> 
> corefDShow = dshowLabel (shows :: Coref -> ShowS)
> 
> 
> showDM :: DShow -> DynamicMap -> ShowS
> showDM sd = foldDM (\d b -> case sd d of { Nothing -> b ; 
> Just s -> s .
> b }) id
> 
> dm1 = addToDM emptyDM (Range 1 2)
> ---------------------------------------
> 
> Now, load Coref.hs in GHCi:
> 
>    ___         ___ _
>   / _ \ /\  /\/ __(_)
>  / /_\// /_/ / /  | |      GHC Interactive, version 6.0, for 
> Haskell 98.
> / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
> \____/\/ /_/\____/|_|      Type :? for help.
> 
> Loading package base ... linking ... done.
> Loading package lang ... linking ... done.
> Prelude> :load c:/home/t-hald/projects/Bugs/Coref.hs
> Compiling DynamicMap       ( DynamicMap.hs, interpreted )
> Compiling Range            ( Range.hs, interpreted )
> Compiling Coref            ( c:/home/t-hald/projects/Bugs/Coref.hs,
> interpreted )
> Ok, modules loaded: Coref, Range, DynamicMap.
> *Coref> showDM corefDShow dm1 ""
> ""
> *Coref> :!touch Coref.hs
> *Coref> :r
> Compiling Coref            ( c:/home/t-hald/projects/Bugs/Coref.hs,
> interpreted )
> Ok, modules loaded: Coref, Range, DynamicMap.
> *Coref> showDM corefDShow dm1 ""
> "Coref=Coref 1 2 
> Process ghci exited abnormally with code 5
> 
> 
> for some reason having the DShow definitions in the same file as Range
> is important (I originally tried having the DShow definitions in their
> own file, imported by all the others, but that didn't exhibit 
> the bug).
> 
> 
>  --
>  Hal Daume III                                   | hdaume at isi.edu
>  "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume
> 
> 
> > -----Original Message-----
> > From: glasgow-haskell-bugs-admin at haskell.org 
> > [mailto:glasgow-haskell-bugs-admin at haskell.org] On Behalf 
> Of Hal Daume
> > Sent: Thursday, August 14, 2003 3:46 PM
> > To: Hal Daume; glasgow-haskell-bugs at haskell.org
> > Subject: RE: very strange behavior (crashes!) with Dynamics
> > 
> > 
> > This hasn't yet been posted, but I've actually whittled it 
> > down quite a
> > bit.
> > 
> > All we need is to import the Util.DynamicMap and do:
> > 
> > > dm1 = addToDM emptyDM (Range 1 2)
> > > showDM :: DShow -> DynamicMap -> ShowS
> > > showDM sd = foldDM (\d b -> case sd d of { Nothing -> b ; 
> > Just s -> s
> > . b }) id
> > 
> > and do the show definition for Coref and then we get:
> > 
> > Compiling ReadCorefData    (
> > c:/home/t-hald/projects/PennUtil/ReadCorefData.hs, interpreted )
> > Ok, modules loaded: ReadCorefData, PennUtil.Util, Util.DynamicMap,
> > NLP.PennParser, NLP.FiniteMap, NLP.String, NLP.Util, Common.
> > *ReadCorefData> showDM corefDShow dm1 ""
> > Loading package haskell98 ... linking ... done.
> > ""
> > *ReadCorefData> :!touch ReadCorefData.hs
> > *ReadCorefData> :r
> > Compiling ReadCorefData    (
> > c:/home/t-hald/projects/PennUtil/ReadCorefData.hs, interpreted )
> > Ok, modules loaded: ReadCorefData, PennUtil.Util, Util.DynamicMap,
> > NLP.PennParser, NLP.FiniteMap, NLP.String, NLP.Util, Common.
> > *ReadCorefData> showDM corefDShow dm1 ""
> > "Coref=Coref 1 2 
> > Process ghci exited abnormally with code 5
> > 
> > 
> > interestingly it seems to be trying to read this as the range 
> > (since the
> > two ints are the same as the initial ones)...
> > 
> >  --
> >  Hal Daume III                                   | hdaume at isi.edu
> >  "Arrest this man, he talks in maths."           | 
> www.isi.edu/~hdaume
> > 
> > 
> > > -----Original Message-----
> > > From: Hal Daume 
> > > Sent: Thursday, August 14, 2003 12:37 PM
> > > To: 'glasgow-haskell-bugs at haskell.org'
> > > Subject: very strange behavior (crashes!) with Dynamics
> > > 
> > > 
> > > First, I apologize for the length of this message.  
> > > Unfortunately, I cannot whittle this down to a smaller example.
> > > 
> > > I'm dealing with parse trees, whose datatype looks like:
> > > 
> > > > data AnnTree a
> > > >     = Term    { treeTag :: PackedString, treeText :: 
> > > PackedString   , treeAnn :: a }
> > > >     | NonTerm { treeTag :: PackedString, treeChildren :: 
> > > [AnnTree a], treeAnn :: a }
> > > >     deriving (Eq, Ord)
> > > 
> > > In particular, I parameterize these over a DynamicMap 
> > > datatype, which looks like:
> > > 
> > > > import Data.Dynamic
> > > > type DynamicMap = FiniteMap String Dynamic  -- cuz TypeRep 
> > > \not \in Ord :(
> > > 
> > > This supports, for instance:
> > > 
> > > > stypeOf x = show (typeOf x)
> > > > ttypeOf (x :: T a) = stypeOf (undefined :: a)
> > > > 
> > > > emptyDM :: DynamicMap
> > > > emptyDM = emptyFM
> > > > 
> > > > addToDM :: Typeable a => DynamicMap -> a -> DynamicMap
> > > > addToDM dm a = addToFM dm (stypeOf a) (toDyn a)
> > > > 
> > > > lookupDM :: Typeable a => DynamicMap -> Maybe a
> > > > lookupDM dm :: Maybe a =
> > > >     case lookupFM dm (stypeOf (undefined :: a)) of
> > > >       Nothing -> Nothing
> > > >       Just x  -> fromDynamic x
> > > 
> > > as well as a few other of the standard FM functions that I need.
> > > 
> > > I have a type synonym:
> > > 
> > > > type DTree = AnnTree DynamicMap
> > > 
> > > so that I can add whatever types of annotations I want to 
> the tree.
> > > 
> > > I also provide methods of showing the trees with various 
> > > annotations shown, based on a DShow type:
> > > 
> > > > type DShow = Dynamic -> Maybe ShowS
> > > > dshowLabel :: Typeable a => (a -> ShowS) -> DShow
> > > > dshowLabel x d = 
> > > >   case fromDynamic d of
> > > >     Nothing -> Nothing
> > > >     Just v  -> Just (shows (typeOf v) . showChar '=' . x v)
> > > > 
> > > > showDTreeWith :: DShow -> DTree -> ShowS
> > > > showDTreeWith shws t =
> > > >   showChar '(' . 
> > > >     showString (unpackPS (treeTag t)) .
> > > >     showChar ' ' . showAnn (treeAnn t) .
> > > >     (if isTerm t 
> > > >        then showString (unpackPS (treeText t))
> > > >        else showChildren (treeChildren t)) .
> > > >     showChar ')'
> > > >   where
> > > >     showChildren []   = showString "<<EMPTY>>"
> > > >     showChildren [ch] = showDTreeWith shws ch
> > > >     showChildren (ch:chl) = showDTreeWith shws ch . 
> > > showChar ' ' . showChildren chl
> > > >     showAnn a = showList (foldDM showAnn' [] a)
> > > >     showAnn' dyn acc = 
> > > >       case shws dyn of
> > > >         Nothing -> acc
> > > >         Just ss -> showChar '{' . ss . showChar '}' : acc
> > > >     showList [] = id
> > > >     showList [x] = showChar '{' . x . showChar '}' . 
> showChar ' '
> > > >     showList (x:xs) = showChar '{' . x . showList' xs . 
> > > showChar '}' . showChar ' '
> > > >     showList' [] = id
> > > >     showList' (x:xs) = showChar ';' . x . showList' xs
> > > 
> > > Basically, what this does is it is given a DShow (which can 
> > > be combined, of course, using non-shown functions), and 
> > > prints the tree with the dynamic annotations shown in braces. 
> > >  The dshowLabel function takes a shows function and creates a 
> > > DShow function based on it.
> > > 
> > > For instance, I have a coreference data type, which looks like:
> > > 
> > > > data Coref = Coref Int Int Bool (Maybe String) 
> > > >     -- Id, ref, in-min; eventually we cannonicalize these
> > > >     -- and we can assume id= ref, type
> > > >          deriving (Eq, Ord, Show)
> > > 
> > > We make this an instance of Typeable so we can put it in 
> > dynamic maps:
> > > 
> > > > corefTypeCon = mkTyCon "Coref" ; corefTypeRep = mkAppTy 
> > > corefTypeCon []
> > > > instance Typeable Coref where typeOf _ = corefTypeRep
> > > > {-# NOINLINE corefTypeCon #-}
> > > > {-# NOINLINE corefTypeRep #-}
> > > 
> > > Now, we have another annotation type, Range, which specifies 
> > > what subset of the sentence a given node covers.
> > > 
> > > > data Range = Single Int
> > > >            | Range  Int Int
> > > > 
> > > > instance Show Range where
> > > >   showsPrec _ (Single i) = shows i
> > > >   showsPrec _ (Range i j) = shows i . showChar '^' . shows j
> > > > 
> > > > rangeTypeCon = mkTyCon "Range" ; rangeTypeRep = mkAppTy 
> > > rangeTypeCon []
> > > > instance Typeable Range where typeOf _ = rangeTypeRep
> > > > {-# NOINLINE rangeTypeCon #-}
> > > > {-# NOINLINE rangeTypeRep #-}
> > > 
> > > And we can take a DTree and add ranges with:
> > > 
> > > > numberTree :: Int -> DTree -> (Int, DTree)
> > > > numberTree n t@(Term _ _ _) = (n+1, addAnn t (Single n))
> > > > numberTree n t@(NonTerm _ chl _) =
> > > >     let (n',chl') = mapAccumL numberTree n chl
> > > >     in  (n', addAnn (t { treeChildren = chl' }) (mkRange 
> > n (n'-1)))
> > > 
> > > The associate DShow function is:
> > > 
> > > > rangeDShow :: DShow
> > > > rangeDShow = dshowLabel (shows :: Range -> ShowS)
> > > 
> > > Now, we parse a tree, convert it into a dtree and number it:
> > > 
> > > We do:
> > > 
> > > > (_:Right (_,tree):_) = parseFile "wsj93_005.0011.par" 
> > > (unsafePerformIO $ readFile "wsj93_005.0011.par")
> > > 
> > > now, tree is of type AnnTree ().  We can convert this to a 
> > > DTree with nothing in it by applying the mkDTree function:
> > > 
> > > > mkDTree :: Tree -> DTree
> > > > mkDTree (Term tag txt _) = Term tag txt emptyDM
> > > > mkDTree (NonTerm tag chl _) = NonTerm tag (map mkDTree 
> > chl) emptyDM
> > > 
> > > And the number it, by doing:
> > > 
> > > > pTree :: DTree
> > > > pTree = snd $ numberTree 1 $ mkDTree tree
> > > 
> > > we can test showing this by:
> > > 
> > > *ReadCorefData> showDTreeWith rangeDShow pTree ""
> > > "(TOP {{Range=1^32}} (S {{Range=1^32}} (NP-A {{Range=1^11}} 
> > > (NPB {{Range=1^4}} (NE {{Range=1^3}} (NNP {{Range=1}} 
> > > Michael) (NNP {{Range=2}} D.) (NNP {{Range=3}} Casey)) (COMMA 
> > > {{Range=4}} ,)) (NP {{Range=5^11}} (NPB {{Range=5^11}} (DT 
> > > {{Range=5}} a) (JJ {{Range=6}} top) (NE {{Range=7}} (NNP 
> > > {{Range=7}} Johnson)) (CC {{Range=8}} &) (NE {{Range=9}} (NNP 
> > > {{Range=9}} Johnson)) (NN {{Range=10}} manager) (COMMA 
> > > {{Range=11}} ,)))) (VP {{Range=12^32}} (VBD {{Range=12}} 
> > > moved) (PP {{Range=13^23}} (TO {{Range=13}} to) (NP-A 
> > > {{Range=14^23}} (NPB {{Range=14^17}} (NE {{Range=14^16}} (NNP 
> > > {{Range=14}} Genetic) (NNP {{Range=15}} Therapy) (NNP 
> > > {{Range=16}} Inc.)) (COMMA {{Range=17}} ,)) (NP 
> > > {{Range=18^23}} (NPB {{Range=18^21}} (DT {{Range=18}} a) (JJ 
> > > {{Range=19}} small) (NN {{Range=20}} biotechnology) (NN 
> > > {{Range=21}} concern)) (ADVP {{Range=22^23}} (RB {{Range=22}} 
> > > here) (COMMA {{Range=23}} ,))))) (SG {{Range=24^32}} (VP 
> > > {{Range=24^32}} (TO {{Range=24}} to) (VP-A {{Range=25^32}} 
> > > (VB {{Range=25}} become) (NP-A_AND {{Range=26^32}} (NP 
> > > {{Range=26^27}} (NPB {{Range=26^27}} (PRP$ {{Range=26}} its) 
> > > (NN {{Range=27}} president))) (CC {{Range=28}} and) (NP 
> > > {{Range=29^32}} (NPB {{Range=29^32}} (NN {{Range=29}} chief) 
> > > (VBG {{Range=30}} operating) (NN {{Range=31}} officer) 
> > > (PERIOD {{Range=32}} .))))))))))"
> > > 
> > > you can take my word that this is correct :).
> > > 
> > > We can show it without the annotations by:
> > > 
> > > *ReadCorefData> showDTreeWith dshow0 pTree ""
> > > "(TOP (S (NP-A (NPB (NE (NNP Michael) (NNP D.) (NNP Casey)) 
> > > (COMMA ,)) (NP (NPB (DT a) (JJ top) (NE (NNP Johnson)) (CC &) 
> > > (NE (NNP Johnson)) (NN manager) (COMMA ,)))) (VP (VBD moved) 
> > > (PP (TO to) (NP-A (NPB (NE (NNP Genetic) (NNP Therapy) (NNP 
> > > Inc.)) (COMMA ,)) (NP (NPB (DT a) (JJ small) (NN 
> > > biotechnology) (NN concern)) (ADVP (RB here) (COMMA ,))))) 
> > > (SG (VP (TO to) (VP-A (VB become) (NP-A_AND (NP (NPB (PRP$ 
> > > its) (NN president))) (CC and) (NP (NPB (NN chief) (VBG 
> > > operating) (NN officer) (PERIOD .))))))))))"
> > > 
> > > now, note that we have *NOT* ever added any annotations 
> > > having to do with corefs to it.
> > > 
> > > however, we can still segfault ghci by doing:
> > > 
> > > *ReadCorefData> showDTreeWith corefDShow pTree ""
> > > "(TOP {{Coref=Coref 1 32 
> > > Process ghci exited abnormally with code 5
> > > 
> > > where it gets the 1 32 is beyond me :).
> > > 
> > > now, for some more fun, I can reload this module into ghci, 
> > > and run it and it works fine:
> > > 
> > >    ___         ___ _
> > >   / _ \ /\  /\/ __(_)
> > >  / /_\// /_/ / /  | |      GHC Interactive, version 6.0, for 
> > > Haskell 98.
> > > / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
> > > \____/\/ /_/\____/|_|      Type :? for help.
> > > 
> > > Loading package base ... linking ... done.
> > > Loading package lang ... linking ... done.
> > > :   Can't find module `'
> > >     (use -v to see a list of the files searched for)
> > > Prelude> :load c:/home/t-hald/projects/PennUtil/ReadCorefData.hs
> > > Skipping  Common           ( /home/t-hald/projects/Common.hs, 
> > > /home/t-hald/projects/Common.o )
> > > Compiling NLP.Util         ( 
> > > /home/t-hald/projects/NLP/Util.hs, interpreted )
> > > Skipping  NLP.String       ( 
> > > /home/t-hald/projects/NLP/String.lhs, 
> > > /home/t-hald/projects/NLP/String.o )
> > > Skipping  NLP.FiniteMap    ( 
> > > /home/t-hald/projects/NLP/FiniteMap.hs, 
> > > /home/t-hald/projects/NLP/FiniteMap.o )
> > > Compiling NLP.PennParser   ( 
> > > /home/t-hald/projects/NLP/PennParser.hs, interpreted )
> > > Compiling Util.DynamicMap  ( 
> > > /home/t-hald/projects/Util/DynamicMap.hs, interpreted )
> > > Compiling PennUtil.Util    ( 
> > > /home/t-hald/projects/PennUtil/Util.hs, interpreted )
> > > Compiling ReadCorefData    ( 
> > > c:/home/t-hald/projects/PennUtil/ReadCorefData.hs, interpreted )
> > > Ok, modules loaded: ReadCorefData, PennUtil.Util, 
> > > Util.DynamicMap, NLP.PennParser, NLP.FiniteMap, NLP.String, 
> > > NLP.Util, Common.
> > > *ReadCorefData> showDTreeWith corefDShow pTree ""
> > > Loading package haskell98 ... linking ... done.
> > > "(TOP (S (NP-A (NPB (NE (NNP Michael) (NNP D.) (NNP Casey)) 
> > > (COMMA ,)) (NP (NPB (DT a) (JJ top) (NE (NNP Johnson)) (CC &) 
> > > (NE (NNP Johnson)) (NN manager) (COMMA ,)))) (VP (VBD moved) 
> > > (PP (TO to) (NP-A (NPB (NE (NNP Genetic) (NNP Therapy) (NNP 
> > > Inc.)) (COMMA ,)) (NP (NPB (DT a) (JJ small) (NN 
> > > biotechnology) (NN concern)) (ADVP (RB here) (COMMA ,))))) 
> > > (SG (VP (TO to) (VP-A (VB become) (NP-A_AND (NP (NPB (PRP$ 
> > > its) (NN president))) (CC and) (NP (NPB (NN chief) (VBG 
> > > operating) (NN officer) (PERIOD .))))))))))"
> > > *ReadCorefData> 
> > > 
> > > just as it shouldn't print any coref data (as it doesn't know 
> > > any!), it doesn't.
> > > 
> > > now, i insert a blank line somewhere in the source, save it, 
> > > and reload (just to force ghci to actually reload it), and:
> > > 
> > > *ReadCorefData> :r
> > > Compiling ReadCorefData    ( 
> > > c:/home/t-hald/projects/PennUtil/ReadCorefData.hs, interpreted )
> > > Ok, modules loaded: ReadCorefData, PennUtil.Util, 
> > > Util.DynamicMap, NLP.PennParser, NLP.FiniteMap, NLP.String, 
> > > NLP.Util, Common.
> > > *ReadCorefData> showDTreeWith corefDShow pTree ""
> > > "(TOP {{Coref=Coref 1 32 
> > > Process ghci exited abnormally with code 5
> > > 
> > > 
> > > I can do this every time :).
> > > 
> > > I should mention that NLP.FiniteMap was created by stealing 
> > > the code from Data.FiniteMap and adding a few functions I 
> > > felt were missing.
> > > 
> > > I've attached all the relevant source code.  The 
> > > PennUtil/ReadCorefData.hs is the module we're trying to run.  
> > > You should untar it into a new directory if you want to 
> > > experiment with it.
> > > 
> > > Any help would really be incredibly appreciated.
> > > 
> > > Thanks!
> > > 
> > >  - Hal
> > > 
> > > --
> > >  Hal Daume III                                   | hdaume at isi.edu
> > >  "Arrest this man, he talks in maths."           | 
> www.isi.edu/~hdaume
> > 
> _______________________________________________
> Glasgow-haskell-bugs mailing list
> Glasgow-haskell-bugs at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
> _______________________________________________
> Glasgow-haskell-bugs mailing list
> Glasgow-haskell-bugs at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
> 



More information about the Glasgow-haskell-bugs mailing list