Chicos:
https://docs.google.com/document/d/1k2KX...edit?pli=1
Acá está el final de Paradigmas del 17/12/2011. Lo resolví pero no sé si está del todo bien. Si me pueden dar una mano se los agradecería.
Resolución
1.-
A) Se puede afirmar que:
2.- Al querer cargar las definiciones en Haskell nos da error.
Al cargarlo en Haskell la definición de la función “quienPelea” devuelve un error de tipo, ya que en un caso devuelve a una persona ([char]) y en otra una lista de personas ([[char]]).
B) Se puede afirmar que:
3.- Los métodos se guardan sin errores y todo el workspace se ejecuta sin generar ningún error.
No genera ningún error porque Ash es más fuerte que Gary, de lo contrario, habría un error ya que al realizar
ash amigos: 9000.
Se pierde la colección creada en el método initialize y cuando se ejecute quienPeleaCon: tiene ejecutar misPrimerosCincoAmigosMasFuertesQue
misPrimerosCincoAmigosMasFuertesQue: agresor
| primerosAmigos |
primerosAmigos := Bag new.
self amigos do: [ :unAmigo |
(unAmigo esMasFuerteQue: agresor)
ifTrue: [ primerosAmigos add: unAmigo.
primerosAmigos size >= 5 ifTrue: [ ^primerosAmigos ]]
].
^primerosAmigos
Como la variable amigos quedó como 9000 y no como una colección devolvería un error al ejecutar amigos do: ya que 9000 no lo entiende.
C) Se puede afirmar que:
3.- Ninguna de las anteriores.
No hay ningún error, sólo que devuelve a X = ash, por como está definida la función
quienPelea/3 al ser Ash más fuerte que Gary (100 vs 99), se cumple la primer cláusula de la función, quienPelea(Atacado,Agresor,Atacado), por lo que X matchea con Ash.
2.-
a) Dadas dos personas, un atacado y un agresor, si el atacado tiene mayor fuerza que el agresor, devolverá al atacado, en caso contrario, devolverá a los 5 amigos (del atacado) que tenga mayor fuerza que el agresor.
b) Sólo se puede incorporar en el paradigma de Objetos, ya que es el único de los tres que tiene Asignación Destructiva.
3-
a) Tendría que entrar en un loop infinito pero debido a la evaluación diferida sólo va a tomar los 5 elementos que necesita la función primerosCincoAmigosMasFuertesDe, por lo que devolverá la siguiente lista: [“misty”,”misty”,”misty”,”misty”,”misty”]
b) Entraría en un loop infinito, al llamarse recursivamente al getter “amigos” en:
misAmigos addAll: self amigos.
c) Al tratarse de un predicado recursivo en el cuál no hay caso base, el mismo entraría en un loop infinito.
4.-
a) El método “misPrimerosCincoAmigosMasGrososQue” tardaría más que “misPrimerosCincoAmigosMasFuertesQue” y esto está relacionado en la declaratividad de cada método. En el primero se evalúan todos los amigos y del total se toman 5, mientras que en el segundo se evalúa al agregar un amigo a la colección si la misma ya tiene 5 amigos. En caso de ser afirmativo se devuelve la colección de amigos.
b) En el método misPrimerosCincoAmigosMasGrososQue no se sabe qué devuelve porque no se conoce la implementación del método first.
En el segundo si tiene menos de 5 elementos, devuelve el mensaje de error.
Ees preferible el método misPrimerosCincoAmigosMasFuertesQue porque asegura que ante la falta de los 5 elementos devuelva un mensaje de error.
Muchas gracias.
Leandro.