es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué list-tail genera una excepción? ¿Por qué no tenemos la propiedad de cierre con respecto a cdr?

Si evalúas (list-tail '(1 2) 3) en guile scheme, obtendrás una excepción. Sería más inteligente tener como respuesta un ‘(). En general, ¿por qué no tenemos la propiedad de cierre con respecto al combinador cdr? ¿Qué complicaciones pueden surgir?

Ejemplos para hacer mi punto más claro:
Ahora, (cdr (cdr (cdr '(1 2)))) -> lanza una excepción
Debería ser (cdr (cdr (cdr ... (cdr '(1 2))...))) -> ()

Entonces automáticamente tendríamos list-tail funcionando correctamente:

(define (list-tail list n) 
  (if (= n 0)
      list
      (list-tail (cdr list) (- n 1))))

Luego, group-by podría escribirse de manera elegante y sin excepciones:

(define (group-by list-arg n)
  (if (null? list-arg)
      '()
      (cons (list-head n) (list-tail n))))
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Cuando intentamos evaluar (list-tail '(1 2) 3) en Guile Scheme, obtenemos una excepción porque la longitud de la lista es más corta que el número de elementos que queremos eliminar. En este caso, queremos eliminar 3 elementos de la lista, pero la lista solo tiene 2 elementos. La respuesta correcta sería una lista vacía (), que es lo que obtendríamos si aplicáramos el combinador cdr repetidamente hasta llegar al final de la lista.

    La razón por la cual no tenemos propiedad de cierre con respecto al combinador cdr es que puede haber complicaciones cuando intentamos aplicarlo a listas incorrectas, es decir, listas que no terminan con una lista vacía. Por ejemplo, si intentamos aplicar el combinador cdr a la lista (1 . 2), obtenemos el valor 2, que no es una lista. Si intentamos aplicar nuevamente el combinador cdr, obtenemos una excepción porque estamos intentando tomar el cdr de un valor que no es una lista.

    Estas complicaciones pueden surgir cuando estamos tratando con listas anidadas o cuando tenemos que aplicar el combinador cdr a una lista cuya longitud es desconocida. En estos casos, es posible que tengamos que recurrir a la recursión para recorrer la lista y aplicar el combinador cdr de forma iterativa hasta llegar al final de la lista.

    Si tuviéramos propiedad de cierre con respecto al combinador cdr, podríamos simplificar la implementación de algunas funciones que operan en listas, pero también tendríamos que lidiar con las complicaciones de las listas incorrectas. En la práctica, a menudo es más fácil y seguro utilizar la recursión para implementar funciones de manipulación de listas en Scheme.

Comments are closed.