2 votes

Impossible de comprendre la fonction racket

Mon professeur nous a donné cette fonction :

(: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean))

(define (every? pred lst)
  (or (null? lst)
      (and (pred (first lst))
           (every? pred (rest lst)))))

Je ne comprenais pas la signification de : All (A) (A -> Boolean) . s'il vous plaît, quelqu'un peut-il m'expliquer - quelle est la signification de la variable, ce que la fonction obtient, ce qu'elle fait et ce qu'elle renvoie parce que je ne peux pas le comprendre.

5voto

soegaard Points 6541

Donnons la fonction every? un tour au repl :

> (every? even? (list 1 2 3 4))
#f

> (every? char? (list #\a #\b #\c))
#t

Notez que le type de la première liste (list 1 2 3 4) est (Listof Number) . Le type de la deuxième liste (list #\a #\b #\c) est (Listof Char) .

Quel type doit être le lst argument de every? ont ? Il est clair qu'il doit s'agir d'une liste, mais de quel type sont les éléments ? Nous ne le savons pas, alors nous en faisons une (Listof A)A se trouve sur pour un certain type (inconnu).

Cependant, le prédicat pred est appelé sur les éléments de la liste, donc le type doit correspondre. Dans le premier exemple : even? a le type "fonction de nombre à booléen" aka (A -> Boolean) .

En général, nous avons besoin du type : (A -> Boolean) pour le prédicat.

Cela devient :

  (: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean))

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