Monads/List monad: Difference between revisions

(+Racket)
Line 484:
 
{{trans|JavaScript}}
 
=== Vanilla Racket ===
 
Note that this also demonstrates how to use Racket's macro system to implement the do syntax.
Line 529 ⟶ 531:
 
(pythagorean-triples* 25)
;; => '((3 4 5) (5 12 13) (6 8 10) (8 15 17) (9 12 15) (12 16 20))</lang>
 
=== With functional package ===
 
The [https://docs.racket-lang.org/functional/interfaces.html functional] package has already implemented the list monad.
 
<lang racket>#lang racket
 
(require data/monad
data/applicative)
 
(define (pythagorean-triples n)
(sequence->list
(do [x <- (range 1 n)]
[y <- (range (add1 x) n)]
[z <- (range (add1 y) n)]
(if (= (+ (* x x) (* y y)) (* z z))
(pure (list x y z))
'()))))
 
(pythagorean-triples 25)
;; => '((3 4 5) (5 12 13) (6 8 10) (8 15 17) (9 12 15) (12 16 20))</lang>
 
Anonymous user