RosettaCodeData/Task/Parametric-polymorphism/Racket/parametric-polymorphism.rkt

21 lines
471 B
Racket

#lang typed/racket
(define-type (Tree A) (U False (Node A)))
(struct: (A) Node
([val : A] [left : (Tree A)] [right : (Tree A)])
#:transparent)
(: tree-map (All (A B) (A -> B) (Tree A) -> (Tree B)))
(define (tree-map f tree)
(match tree
[#f #f]
[(Node val left right)
(Node (f val) (tree-map f left) (tree-map f right))]))
;; unit tests
(require typed/rackunit)
(check-equal?
(tree-map add1 (Node 5 (Node 3 #f #f) #f))
(Node 6 (Node 4 #f #f) #f))