Estou tentando lidar com certos tipos de erros no Racket digitado. O código a seguir funciona conforme esperado no Racket digitado e não digitado
(with-handlers
([exn:fail:contract:divide-by-zero?
(lambda (e)
(raise e))])
(let ([x 0]
[y 1])
(display (/ y x))))
resultando na mensagem de erro
/: division by zero
Uma ligeira elaboração funciona em Racket não digitado:
(with-handlers
([exn:fail:contract:divide-by-zero?
(lambda (e)
(displayln "oops!")
(raise e))])
(let ([x 0]
[y 1])
(display (/ y x))))
oops!
/: division by zero
Porém dá a seguinte mensagem de erro no Racket digitado:
Type Checker: No function domains matched in function application:
Domains: (U (Rec flat (U (Immutable-HashTable flat flat) (Immutable-Vectorof flat) (Pairof flat flat) Boolean Bytes Char Complex Keyword Null String Symbol)) exn) Any
(U (Rec flat (U (Immutable-HashTable flat flat) (Immutable-Vectorof flat) (Pairof flat flat) Boolean Bytes Char Complex Keyword Null String Symbol)) exn)
Arguments: Any
in: (raise e)
Alguém pode explicar o que está acontecendo aqui ou sugerir uma solução alternativa?
Enquanto no Racket normal o primeiro argumento
raise
pode ser qualquer valor, por algum motivo no Typed Racket ele é limitado a uma lista de tipos específicos, incluindo aexn
hierarquia de estruturas.Descobri que quase sempre é necessário especificar explicitamente os tipos de argumentos das funções; Typed Racket normalmente não os infere e fornece o
Any
tipo genérico. Assim, para satisfazerraise
o tipo de: