El mapa muestra una lista de funciones de una lista
-
11-12-2019 - |
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))))))
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
?