make list operations polymorphic functions

This commit is contained in:
Sam Caldwell 2019-05-10 10:28:42 -04:00
parent 75539d0ec3
commit 2c0bef7da4
3 changed files with 10 additions and 47 deletions

View File

@ -7,6 +7,7 @@
(require (only-in "list.rkt" List ~List)) (require (only-in "list.rkt" List ~List))
(require (only-in "set.rkt" Set ~Set)) (require (only-in "set.rkt" Set ~Set))
(require (only-in "hash.rkt" Hash ~Hash)) (require (only-in "hash.rkt" Hash ~Hash))
(require (only-in "prim.rkt" Bool))
(begin-for-syntax (begin-for-syntax
(define-splicing-syntax-class iter-clause (define-splicing-syntax-class iter-clause
@ -89,7 +90,7 @@
(values #`(in-set- #,e) #'t)] (values #`(in-set- #,e) #'t)]
[_ [_
(type-error #:src e (type-error #:src e
#:msg "not an iterable type: " τ)])) #:msg "not an iterable type: ~a" τ)]))
(define-typed-syntax for/fold (define-typed-syntax for/fold

View File

@ -3,12 +3,12 @@
(provide List (provide List
(for-syntax ~List) (for-syntax ~List)
list list
cons (typed-out [[cons- : ( (X) (→fn X (List X) (List X)))] cons]
first [[first- : ( (X) (→fn (List X) X))] first]
rest [[rest- : ( (X) (→fn (List X) (List X)))] rest]
member? [[member?- ( (X) (→fn X (List X) Bool))] member?]
empty? [[empty?- ( (X) (→fn (List X) Bool))] empty?]
reverse) [[reverse- ( (X) (→fn (List X) (List X)))] reverse]))
(require "core-types.rkt") (require "core-types.rkt")
(require (only-in "prim.rkt" Bool)) (require (only-in "prim.rkt" Bool))
@ -26,44 +26,5 @@
------------------- -------------------
[ (list- e- ...) (List (U τ ...))]) [ (list- e- ...) (List (U τ ...))])
(define-typed-syntax (cons e1 e2)
[ e1 e1- τ1]
#:fail-unless (pure? #'e1-) "expression must be pure"
[ e2 e2- (~List τ2)]
#:fail-unless (pure? #'e2-) "expression must be pure"
#:with τ-l (type-eval #'(List (U τ1 τ2)))
----------------------------------------
[ (cons- e1- e2-) τ-l])
(define-typed-syntax (empty? e)
[ e e- (~List _)]
#:fail-unless (pure? #'e-) "expression must be pure"
-----------------------
[ (empty?- e-) Bool])
(define-typed-syntax (first e)
[ e e- (~List τ)]
#:fail-unless (pure? #'e-) "expression must be pure"
-----------------------
[ (first- e-) τ])
(define-typed-syntax (rest e)
[ e e- (~List τ)]
#:fail-unless (pure? #'e-) "expression must be pure"
-----------------------
[ (rest- e-) (List τ)])
(define-typed-syntax (member? e l)
[ e e- τe]
#:fail-unless (pure? #'e-) "expression must be pure"
[ l l- (~List τl)]
#:fail-unless (pure? #'l-) "expression must be pure"
#:fail-unless (<: #'τe #'τl) "incompatible list"
----------------------------------------
[ (member?- e- l-) Bool])
(define- (member?- v l) (define- (member?- v l)
(and- (member- v l) #t)) (and- (member- v l) #t))
(require/typed racket/base
[reverse : ( (X) (→fn (List X) (List X)))])

View File

@ -57,7 +57,8 @@
: (List (Tuple Int Int)) : (List (Tuple Int Int))
(list (tuple 1 4) (tuple 2 5) (tuple 3 6))) (list (tuple 1 4) (tuple 2 5) (tuple 3 6)))
(define (zip-even [xs : (List Int)] ;; binding in #:when isn't handled
#;(define (zip-even [xs : (List Int)]
[ys : (List Int)]) [ys : (List Int)])
((inst reverse (Tuple Int Int)) ((inst reverse (Tuple Int Int))
(for/fold ([acc : (List (Tuple Int Int)) (for/fold ([acc : (List (Tuple Int Int))