
Hello everyone, I am quite new to monadic code so I would like to ask for improvement suggestions on the last line of the code below. I know I could do something like "do strs <- mapM ...; intercalate ..." etc, but I would like to avoid the use of "<-". Thank you, José data XmlState = XmlState Int type XmlM a = State XmlState a loop :: Document -> XmlM String someFn :: [Document] -> XmlM String someFn docs = return concat `ap` (sequence $ intersperse (return "\n") (map loop docs)) <--- improve this line -- José António Branquinho de Oliveira Lopes 58612 - MEIC-A Instituto Superior Técnico (IST), Universidade Técnica de Lisboa (UTL) jose.lopes@ist.utl.pt

On 15/08/12 17:01, José Lopes wrote:
someFn docs = return concat `ap` (sequence $ intersperse (return "\n") (map loop docs))
First of all, "return x `ap` y" = "x `fmap` y" or "x <$> y". fmap (or its infix synonym (<$>)) is the answer here, you could write: someFn docs = concat . intersperse "\n" <$> mapM loop docs The function Data.List.intercalate is a compation of concat and intersperse, so you could write: someFn docs = intercalate "\n" <$> mapM loop docs or, depending on your preference, someFn = fmap (intercalate "\n") . mapM loop Twan

Thank you. On 15-08-2012 23:09, Twan van Laarhoven wrote:
On 15/08/12 17:01, José Lopes wrote:
someFn docs = return concat `ap` (sequence $ intersperse (return "\n") (map loop docs))
First of all, "return x `ap` y" = "x `fmap` y" or "x <$> y". fmap (or its infix synonym (<$>)) is the answer here, you could write:
someFn docs = concat . intersperse "\n" <$> mapM loop docs
The function Data.List.intercalate is a compation of concat and intersperse, so you could write:
someFn docs = intercalate "\n" <$> mapM loop docs
or, depending on your preference,
someFn = fmap (intercalate "\n") . mapM loop
Twan
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- José António Branquinho de Oliveira Lopes 58612 - MEIC-A Instituto Superior Técnico (IST), Universidade Técnica de Lisboa (UTL) jose.lopes@ist.utl.pt

Try:
concat . intersperse "\n" <$> (sequence $ map loop docs)
On Wed, Aug 15, 2012 at 11:01 AM, José Lopes
Hello everyone,
I am quite new to monadic code so I would like to ask for improvement suggestions on the last line of the code below. I know I could do something like "do strs <- mapM ...; intercalate ..." etc, but I would like to avoid the use of "<-".
Thank you, José
data XmlState = XmlState Int type XmlM a = State XmlState a
loop :: Document -> XmlM String
someFn :: [Document] -> XmlM String someFn docs = return concat `ap` (sequence $ intersperse (return "\n") (map loop docs)) <--- improve this line
-- José António Branquinho de Oliveira Lopes 58612 - MEIC-A Instituto Superior Técnico (IST), Universidade Técnica de Lisboa (UTL) jose.lopes@ist.utl.pt
______________________________**_________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/**mailman/listinfo/haskell-cafehttp://www.haskell.org/mailman/listinfo/haskell-cafe
participants (3)
-
Clark Gaebel
-
José Lopes
-
Twan van Laarhoven