[Haskell-beginners] Monads...

Cory Knapp thestonetable at gmail.com
Thu Jan 29 09:48:42 EST 2009


Thanks to both of you, I'll look into those.

Cory

Rafael Gustavo da Cunha Pereira Pinto wrote:
> Cory,
>
> The big hit for me was Phillip Wadler's paper "Monads for functional 
> programming" I made me start thinking "well, this looks like a monad..."
>
> homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf 
> <http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf>
>
> Cheers
>
> On Thu, Jan 29, 2009 at 01:38, nanothief <nanothief at gmail.com 
> <mailto:nanothief at gmail.com>> wrote:
>
>     Cory Knapp wrote:
>
>         Hello, so, I'm having a simple problem with monads: I have no
>         idea how to actually use them. I understand the category
>         theory (or, at least well enough to be able to explain "what
>         is a monad"); I understand the way to declare something as a
>         monad instance, but I just don't get how to program with them.
>         Can anyone provide me with, or direct me towards, some simple
>         monads and some ways of using (for example) the monadic
>         properties of lists?
>
>         Thanks,
>         Cory
>         _______________________________________________
>         Beginners mailing list
>         Beginners at haskell.org <mailto:Beginners at haskell.org>
>         http://www.haskell.org/mailman/listinfo/beginners
>
>     I found that
>     http://www.haskell.org/all_about_monads/html/index.html gave a lot
>     of nice examples of using list and maybe monads. The list monad is
>     particularly useful for finding possible solutions given available
>     input values.
>     For example, with the problem
>     x + 8y = 114
>     3x - 8y + 4z = 182
>     x < y < z < 100
>     Find solutions for x,y,z
>
>     The program:
>     res :: [(Int,Int,Int)]
>     res = do
>      x <- [1..100]
>      y <- [1..100]
>      z <- [1..100]
>      guard $ x + 8 * y == 114
>      guard $ 3*x - 8*y + 4*z == 182
>      guard $ x < y
>      guard $ y < z
>      return (x,y,z)
>
>     will output all the possible solutions. Note how close the program
>     is to the actual problem. The values of x,y, and z are chosen from
>     the value [1..100], but if a guard statement fails, the (x,y,z)
>     choice is abandoned.
>
>     Another example (taken from
>     http://www.mathsisfun.com/puzzles/sum-of-digits-is-43-solution.html )
>     *The Puzzle:* I am thinking of a 6-digit number. The sum of the
>     digits is 43.
>
>     And only two of the following three statements about the number
>     are true:
>
>     (1) it's a square number,
>     (2) it's a cube number, and
>     (3) the number is under 500000.
>
>     the program
>     answer = do
>      d1 <- [0..9]
>      d2 <- [0..9]
>      d3 <- [0..9]
>      d4 <- [0..9]
>      d5 <- [0..9]
>      d6 <- [0..9]
>      let digitSum = d1 + d2 + d3 + d4 + d5 + d6
>      let value = d1 + d2*10 + d3*100 + d4*1000 + d5*10000 + d6*100000
>      guard $ digitSum == 43
>      let lessThan500000 = digitSum < 500000
>      let isSquare = (round $ sqrt (fromIntegral value)) ^ 2 == value
>      let isCube = (round $ (fromIntegral value) ** (1/3)) ^ 3 == value
>      guard $ length (filter id [lessThan500000,isSquare,isCube]) == 2
>      return value
>
>     will output the three answers (not that the author only found one
>     solution!).
>
>
>
>
>     _______________________________________________
>     Beginners mailing list
>     Beginners at haskell.org <mailto:Beginners at haskell.org>
>     http://www.haskell.org/mailman/listinfo/beginners
>
>
>
>
> -- 
> Rafael Gustavo da Cunha Pereira Pinto
> Electronic Engineer, MSc.



More information about the Beginners mailing list