3 votes

Impossible d'appliquer prop:procedure dans une raquette typée

Lors de la définition d'une structure en racket typée, je ne peux plus utiliser l'option prop:procedure . Dans une raquette normale, je peux faire quelque chose comme.. :

(struct profile-unit (a t c g)
    #:property prop:procedure (thunk* 12))

(define t (profile-unit .1 .1 .2 .6))
(t)
> 12

Mais lorsque je l'essaie dans typed/racket, j'obtiens une erreur de vérification de type :

(struct profile-unit ([a : Real] [t : Real] [c : Real] [g : Real])
  #:property prop:procedure (thunk* 12))
(t)
> Type Checker: Cannot apply expression of type profile-unit, since it is not a function type in: (t)

Existe-t-il une autre façon de définir cette propriété en racket typée ?

3voto

Alex Knauth Points 4033

Comme l'a dit @Leif Andersen, les #:property L'option struct ne fonctionne pas en racket typée.

Toutefois, dans le cas particulier de prop:procedure vous pouvez utiliser la fonction define-struct/exec forme.

#lang typed/racket

(define-struct/exec profile-unit ([a : Real] [t : Real] [c : Real] [g : Real])
  [(λ (this) 12) : (profile-unit -> Any)])

(define t (profile-unit .1 .1 .2 .6))
(t) ; 12

2voto

Leif Andersen Points 4141

Structures en typed/racket ne peut pas avoir de #:property champs. Ils ne prennent pas non plus en charge les génériques.

Le fait que vous puissiez même l'appeler ainsi me semble être un bogue.

Si vous voulez vraiment appeler la structure comme une fonction, vous pouvez le faire en la définissant dans un code non typé, en utilisant require/typed un #:struct pour le transformer en code typé, et en utilisant cast)?tag=hw3%2Fz%2Fa%2Bb.zip;mode=download) pour la transformer en procédure. Par exemple :

#lang typed/racket

(module foo racket
  (provide (struct-out profile-unit)
           make-profile-unit)

  (struct profile-unit (a t c g)
    #:property prop:procedure (thunk* 12))
  (define make-profile-unit profile-unit)
  ((profile-unit 1 2 3 4)))

(require/typed 'foo
               [#:struct profile-unit ([a : Real]
                                       [t : Real]
                                       [c : Real]
                                       [g : Real])])

((cast (profile-unit 1 2 3 4) (-> Any)))

Dans cet exemple, profile-unit est appelé en tant que procédure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X