[racket] for*/list and Typed Racket

From: Adolfo Pérez Álvarez (adolfo.pa at gmail.com)
Date: Sun Jun 24 14:54:16 EDT 2012

Hi everyone,

I've been trying to convert the following code to Typed Racket without success:

(define-type Region Number)
(define-type Color Number)

(define-type Map (Listof (Pair Region (Listof Region))))

(: empty-solution (Listof (Pair Region Color)))
(define empty-solution '(()))

(: colorize : Map (Listof Color) -> (Listof (Pair Region Color)))
(define (colorize map colors)
  (for/fold ([solutions empty-solution]) ([entry map])
    (match-let ([(cons region neighbours) entry])
      (for*/list ([s solutions]
                     [c colors]
                     #:unless (findf (λ (rc)
                                       (and (memv (car rc) neighbours)
                                               (eqv? (cdr rc) c)))
        (cons (cons region c) s)))))

It fails to compile, complaining about the lack of type information
inside for*/list. The thing is, I added type signatures to every
single binding inside colorize (I'm quite desperate ;-) ) using the
#{var : type} syntax, but it didn't work, it gave me exactly the same
error message:

Type Checker: Error in macro expansion -- insufficient type
information to typecheck. please add more type annotations in:
(for*/list ((s solutions) (c colors) #:unless (findf (λ (rc) (and
(memv (car rc) neighbours) (eqv? (cdr rc) c))) s)) (cons (cons region
c) s))

I'm using the bleeding edge version (master branch at Github; updated
today 24th June); DrRacket claims to be at version: I'll try to test this with the
latest stable release as soon as possible.


Posted on the users mailing list.