Skip to content

Instantly share code, notes, and snippets.

@BernardNotarianni
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BernardNotarianni/c435b225d7a6861baf0e to your computer and use it in GitHub Desktop.
Save BernardNotarianni/c435b225d7a6861baf0e to your computer and use it in GitHub Desktop.
Tentative de Kata FizzBuzz avec que des monoïdes
#lang racket
(require racket/match)
; notre monoid est l'ensemble des entiers
; union "fizz" union "buzz" union "fizzbuzz"
(define (plus x y)
(match (cons x y)
[(cons a 0) a]
[(cons 0 a) a]
[(cons "fizz" "fizz") "fizz"]
[(cons _ _)
(if (= (+ x y) 3) "fizz"
(+ x y))]))
(module+ test
(require rackunit rackunit/text-ui)
(check-equal? (plus 0 0) 0)
(check-equal? (plus 0 1) 1)
(check-equal? (plus 1 1) 2)
(check-equal? (plus 2 1) "fizz")
(check-equal? (plus 1 2) "fizz")
(check-equal? (plus "fizz" 0) "fizz")
(check-equal? (plus 0 "fizz") "fizz")
(check-equal? (plus "fizz" "fizz") "fizz")
(check-equal? (plus "fizz" 1) 4)
"all test run")
@BernardNotarianni
Copy link
Author

Code en l'état, légèrement nettoyé. Le dernier test ne passe pas (encore).

@sroccaserra
Copy link

Merci !

Je crois qu'avec l'ensemble de départ qu'on a choisit, l'associativité sera compliqué à avoir.

(check-equal? (plus (plus 8 1) 1)  ;; => (plus "fizz" 1) => 4 ?
              (plus 8 (plus 1 1))) ;; => (plus 8 2) => "buzz" ?

Passer par des tuples comme '(1 . 1) ou '(2 . 2) ou '(3 . "fizz") permet de simplifier ce pb (je crois que c'est ce que proposait Cyrille).

Proposition (sans implémentation) ici : https://gist.github.com/sroccaserra/704763eff3680a5938d6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment