[Haskell-cafe] Re: EDSL for Makefile
steffen
steffen.siering at googlemail.com
Wed Oct 6 18:38:19 EDT 2010
The Reader monad just establishes an environment, so you can use "ask"
to retrieve a value from the environment.
Let's say you have the following types representing you Make-
Environment:
data MakeInfo = MakeInfo
{ target_ :: String
, sources_ :: [String]
}
then inside your Monad you can access MakeInfo using "ask". Because
you may want to have IO available, let's use the Monad Transformer
version of the Reader Monad, to define our MakeMonad:
type MakeMonad = ReaderT MakeInfo IO
runMake :: MakeMonad () -> MakeInfo -> IO ()
runMake m makeInfo = runReaderT m makeInfo
and runMake will run it.
Then you can access source and target e.g. with Applicatives:
test = do
sources <- sources_ <$> ask
target <- target_ <$> ask
system $ "gcc -o " ++ target ++ " " ++ (foldl (++) $ map ('
':) sources)
Since using "sources_ <$> ask" and such may still be annoying, this
gist[1] uses some (questionable) TypeClass-hackery and some extension
to overcome this "problem"...
Using this solution one can simply write:
test = sh $ "gcc -o" & target & sources
which looks somewhat nicer. This example also defines runTest and a
test function (which calls the shell command "echo" to print some
lines) you can try in ghci by typing "runTest test"...
[1] http://gist.github.com/614246
On 3 Okt., 16:56, C K Kashyap <ckkash... at gmail.com> wrote:
> On Sun, Oct 3, 2010 at 5:22 PM, steffen <steffen.sier... at googlemail.com> wrote:
> > If you don't want to mention "r1" explicitly, but want to refer to
> > "target", "sources" and such only a monadic approach (e.g. Reader
> > Monad) might be what you want.
>
> Thanks Steffen ... would you be able to give me an example?
>
> --
> Regards,
> Kashyap
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-C... at haskell.orghttp://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list