Question

C'est un devoir, donc je ne veux pas de réponse.J'ai seulement besoin d'un coup de pouce dans la bonne direction.Je dois mapper plusieurs fonctions sur une liste.Par exemple:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

Je parviens à lui faire mapper la première fonction aux éléments de la liste, cependant, je suis très perdu après cela.De plus, comme il s'agit d'une introduction, je me limite aux fonctions d'introduction (const, append, car, cdr, member, etc.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
Était-ce utile?

La solution

Vous devez composer les fonctions que vous recevez dans le f paramètre.Par souci de simplicité, disons qu'il n'y a que deux fonctions dans la liste - vous devez alors appliquer la première fonction à l'élément actuel dans la liste de nombres, puis appliquer la deuxième fonction au résultat de celui-ci.Si vous pouvez utiliser le compose continuez la procédure et modifiez cette ligne dans votre code :

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

...avec celui-ci:

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

Si vous ne pouvez pas utiliser compose, puis remplacez la même ligne par celle-ci :

((cadr f) ((car f) (car l)))               ; now we're applying both functions

Maintenant, si le problème est plus général et que vous devez mapper une liste de fonctions avec plus que deux éléments, puis remplacez une fois de plus la même ligne dans votre code par ceci :

((compose-multi f) (car l))

Et implémentez une fonction d'assistance qui compose et renvoie toutes les fonctions de la liste, par appels successifs à compose.Celui-ci est laissé comme exercice pour vous, étant donné qu'il s'agit d'un devoir - mais si vous comprenez comment le code ci-dessus fonctionne pour seulement deux fonctions, il devrait être assez facile d'étendre le résultat pour une liste de plusieurs fonctions :

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

Notez que la fonction d'identité est requise pour gérer le cas où il n'y a aucun élément dans la liste des fonctions ;c'est très simple à définir, il renvoie simplement la même valeur qui a été passée en paramètre.

Sachez également que compose-multi renvoie un fonction, le résultat de la composition de toutes les fonctions de la liste - compose fait cela pour vous, mais si vous n'êtes pas autorisé à l'utiliser, rappelez-vous simplement que ceci :

(compose x y)

...est équivalent à ceci :

(lambda (n) (x (y n)))

Autres conseils

Il serait peut-être plus facile d'écrire cela sous forme de deux fonctions.On prend une liste de fonctions et une seule entrée, et on applique toutes les fonctions de la liste en série.La sortie d’une application de fonction sera l’entrée de la suivante ;une fois que vous êtes à court de fonctions, vous avez terminé.

L'autre fonction mappera simplement cette fonction d'assistance sur une liste d'entrées.

Voici une autre façon de définir multi-map qui au lieu de la composition utilise l'opération appelée fold.Puisque vous n'êtes autorisé à utiliser que des fonctions d'introduction, ce n'est pas vraiment la réponse à votre mission.Mais ce sera le cas, si vous écrivez votre propre définition de fold (ce n'est pas très long !)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)

Pour vous réchauffer, commencez par un problème plus simple.Généralisez ensuite la solution.

Comment écririez-vous cette fonction ?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

Cela prend une liste, fs, des valeurs de fonction comme argument et un nombre, x, et calculé la valeur de l'application de la (composition des) fonctions dans fs à x?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top