typed-racket
typed-racket copied to clipboard
A strange bug caused by `provide` and recursive `MListof`.
What version of Racket are you using?
v8.2
What program did you run?
#lang typed/racket/base
(provide func-1 func-2)
(define-type MNulls (MListof MNulls))
(: func-1 [-> MNulls Any]) (define (func-1 ns) 1)
(: func-2 [-> MNulls Any]) (define (func-2 ns) 2)
(displayln (func-1 '()))
(displayln (func-2 '()))
What should have happened?
print:
1
2
And if I defined MNulls as (define-type MNulls (Listof MNulls)) or (define-type MNulls (MListof Null)), or didn’t provide both functions, it'll work well.
If you got an error message, please include it here.
car: contract violation
expected: pair?
given: #f
context...:
.../private/map.rkt:40:19: loop
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/combinators/function.rkt:127:0: function-sc-map
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/combinators/function.rkt:33:11: sc-traverse
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:80:0: compute-defs
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:109:0: compute-constraints
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:45:4
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/static-contracts/instantiate.rkt:43:0: instantiate/optimize
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:148:0: generate-contract-def/provide
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:238:0: change-provide-fixups
.../private/runtime.rkt:80:24: temp275
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/private/type-contract.rkt:238:0: change-provide-fixups
[repeats 1 more time]
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/core.rkt:44:10
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/typed-racket.rkt:22:4
It seems that we can use unit to circumvent this bug:
#lang typed/racket/base
(require typed/racket/unit)
(provide func-1 func-2)
(define-type MNulls (MListof MNulls))
(define-signature funcs^
([func-1 : [-> MNulls Any]]
[func-2 : [-> MNulls Any]]))
(define-unit funcs@
(import)
(export funcs^)
(define (func-1 ns) 1)
(define (func-2 ns) 2))
(define-values/invoke-unit funcs@
(import)
(export funcs^))
(displayln (func-1 '()))
(displayln (func-2 '()))