Last active
December 11, 2015 23:59
-
-
Save bradclawsie/4680693 to your computer and use it in GitHub Desktop.
fizzbuzz in typed racket
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang typed/racket | |
(define-type T (U String Integer)) | |
(: fizzbuzz : ((Listof Integer) -> (Listof T))) | |
(define fizzbuzz | |
(lambda (l) | |
(cond [(null? l) '()] | |
[else (let* ([x (car l)] | |
[xs (cdr l)] | |
[mod3 (eq? 0 (modulo x 3))] | |
[mod5 (eq? 0 (modulo x 5))] | |
[v (cond [(and (eq? #t mod3) (eq? #t mod5)) "fizzbuzz"] | |
[(eq? #t mod3) "fizz"] | |
[(eq? #t mod5) "buzz"] | |
[else x])]) | |
(cons v (fizzbuzz xs)))]))) | |
;; in plain racket, this is (build-list 100 values) | |
(: int-range : (Integer -> (Listof Integer))) | |
(define int-range | |
(lambda (n) | |
(: int-range-inner : (Integer Integer -> (Listof Integer))) | |
(define int-range-inner | |
(lambda (m i) | |
(cond [(eq? m i) '()] | |
[else (cons i (int-range-inner m (+ i 1)))]))) | |
(int-range-inner n 0))) | |
(print (fizzbuzz (int-range 100))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The definition for
int-range
can be simplified by using for/list:You may not even need to build the intermediate list though. Here's what it looks like without building the list: https://gist.github.com/4696161
Good luck!