tag:blogger.com,1999:blog-5922395749618357877.post7594282414162749267..comments2023-07-10T11:12:00.082+02:00Comments on code > /dev/null: 9 lines that made me learn monadsUnknownnoreply@blogger.comBlogger1125tag:blogger.com,1999:blog-5922395749618357877.post-58067929696182207622015-10-13T20:29:23.331+02:002015-10-13T20:29:23.331+02:00This becomes much easier to understand if the type...This becomes much easier to understand if the types are explicit. Then it's obvious that you're dealing with the reader monad.<br /><br /> import Data.Map<br /> import Control.Monad<br /><br /> type Env = Map String Integer<br /><br /> type ReadEnv a = Env -> a<br /><br /> number :: a -> ReadEnv a<br /> number = return<br /><br /> add, multiply :: Num a => ReadEnv a -> ReadEnv a -> ReadEnv a<br /> add = liftM2 (+)<br /> multiply = liftM2 (*)<br /><br /> variable :: String -> ReadEnv Integer<br /> variable = findWithDefault 0<br /><br /> environment :: Env<br /> environment = fromList [("a",3), ("b",4), ("c",7)]<br /><br /> expressionTree :: ReadEnv Integer<br /> expressionTree = add (variable "a") (multiply (number 2) (variable "b"))<br /><br /> result :: Integer<br /> result = expressionTree environment<br /><br /> main = print result<br /><br />Bartosz Milewskihttps://www.blogger.com/profile/00814542783250144540noreply@blogger.com