Pregunta

Esta es la tarea, así que no quiero la respuesta.Solo necesito un empujón en la dirección correcta.Estoy obligado a asignar varias funciones en una lista.Por ejemplo:

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

Soy capaz de tener el mapa de la primera función a los elementos de la lista, sin embargo, me siento muy perdido después de eso.También, puesto que este es introductorio, estoy limitado a la introducción a las funciones (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))))))  
¿Fue útil?

Solución

Usted necesita componer las funciones que usted recibe en el f parámetro.Para simplificar, digamos que sólo hay dos funciones en la lista, entonces usted necesita para aplicar la primera función para el elemento actual de la lista de números y, a continuación, aplicar una segunda función para el resultado de que.Si usted puede utilizar el compose procedimiento a seguir adelante con ella y cambiar esta línea en el código:

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

...con esto:

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

Si no se puede usar compose, a continuación, vuelva a colocar la misma línea con esto:

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

Ahora, si el problema es más general y está obligado a asignar una lista de funciones con más de dos elementos, a continuación, una vez más, vuelva a colocar la misma línea en el código con esto:

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

Y aplicar una función auxiliar que crea y devuelve todas las funciones en la lista de las llamadas sucesivas a compose.Esto se deja como un ejercicio para usted, dado que es la tarea - pero si usted entiende cómo el código anterior funciona para sólo dos funciones, debe ser lo suficientemente fácil para extender el resultado para obtener una lista de múltiples funciones:

(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

Observe que la función identidad es necesaria para manejar el caso en que no hay elementos en la lista de funciones;es muy simple de definir, sólo devuelve el mismo valor que se pasa como parámetro.

También ser conscientes de que compose-multi devuelve un la función, el resultado de componer todas las funciones en la lista - compose hace esto para usted, pero si usted no está permitido el uso de sólo recordar que este:

(compose x y)

...es equivalente a esto:

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

Otros consejos

Puede ser más fácil escribir esto como dos funciones.Uno toma una lista de funciones y una entrada única, y aplica todas las funciones en la lista en serie.La salida de una aplicación de función será la entrada para la siguiente;Una vez que se queda sin funciones que hayas terminado.

La otra función simplemente mapeará esta función auxiliar a través de una lista de entradas.

Aquí hay una forma alternativa de definir multi-map, que en lugar de la composición utiliza la operación llamada fold.Dado que solo se le permite usar funciones introductorias, esta no es realmente la respuesta a su tarea.Pero será, si escribe su propia definición de fold (¡no es muy largo!)

(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)

Para entrar en calor, empezar con un problema más sencillo.Luego generalizar la solución.

Cómo escribirías esta función?

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

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

Que toma una lista, fs, de los valores de la función como argumento y un número, x, y calcula el valor de la aplicación de la (composición de funciones en fs a x?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top