
Either is not a monad, you can check this by typing
:i Either
in GHCi; you will not see a line like
instance Monad Either
in the result. Compare this to
:i Maybe
getConf could be something like:
getConf :: FilePath -> IO (Either ParseError Config)
getConf filePath =
do
c <- readConfig filePath -- (Either ParseError ConfigMap)
return $
case c of
Right c' -> Right $ Config $ Map.findWithDefault "web"
"Document-Root" c'
Left _ -> c
Met vriendelijke groet,
Henk-Jan van Tuyl
--
http://Van.Tuyl.eu/
http://members.chello.nl/hjgtuyl/tourdemonad.html
--
On Mon, 09 Nov 2009 10:01:43 +0100, iæfai
With the below code, I am getting an error that I cannot resolve…
Chess.hs:52:82: Couldn't match expected type `Map [Char] [Char]' against inferred type `Either ParseError ConfigMap' In the third argument of `findWithDefault', namely `c' In the `documentRoot' field of a record In the first argument of `return', namely `Config {documentRoot = (findWithDefault "web" "Document-Root" c)}'
The specific code is:
getConf :: FilePath -> IO (Either ParseError Config) getConf filePath = return $ do c <- readConfig filePath -- (Either ParseError ConfigMap) return Config { documentRoot = Map.findWithDefault "web" "Document-Root" c }
The type of c should be Either ParseError ConfigMap, which by my understanding of the Either monad would cause the c to be the Right side stripped, or skipped if Left.
Full source for the module is below, and full project is hosted at http://patch-tag.com/r/iaefai/chess
For some general information, I am replacing ConfigFile dependancy with a Parsec based config parser (I call it SimpleConfig) that suits my needs - it came from
http://www.serpentine.com/blog/2007/01/31/parsing-a-simple-config-file-in-ha... originally and I modified it. On windows ConfigFile's dependancy on a posix regex library was causing trouble, so this is the effort to get rid of that dependancy.
Any thoughts would be useful.
There is one associated thought…
The original function used to get configuration back to the program is -- Mostly from Chris Done's Blog getConf :: FilePath -> IO (Either (C.CPErrorData, String) Config) getConf filePath = runErrorT $ do let cp = C.emptyCP { optionxform = id } contents <- liftIO $ readFile filePath config <- C.readstring cp contents let get = C.get config "DEFAULT" Config <$> get "Document-Root"
I noted it used <$> and in the code that I retrieved originally from Chris Done's blog (no longer able to find it) used <*> for additional items. I would like some easy method of constructing the new Config structure in my new code, especially if it can be done without the record syntax like this thing gets away with. I am not sure how this thing associated "Document-Root" with documentRoot mind you.
Thank you again. iæfai.
--