Ok, estoy intentando hacer una función para determinar si una lista de tuplas es transitiva, es decir, si (x, y) y (y, z) está en la lista, entonces (x , z) también está en la lista.'unificación' en la lista de comprensiones
Por ejemplo, [(1,2), (2,3), (1,3)]
es transitivo.
Ahora, viniendo de un fondo Prolog, el siguiente tiene sentido para mí:
transitive xs = and [elem (x, z) xs | (x, y) <- xs , (y, z) <- xs ]
Sin embargo, no funciona. Parece que la 'y' no obtiene el valor único como era de esperar, sino que se 'reasigna' cuando se trata de la segunda tupla. En su lugar, debemos usar:
transitive xs = and [elem (x, z) xs | (x, y1) <- xs , (y2, z) <- xs, y1 == y2 ]
¿Por qué es así? ¿Por qué el primer ejemplo no causa un error y esto no va en contra del principio de 'transparencia referencial' de los lenguajes de programación funcionales?
"Sin embargo, en los lenguajes funcionales y lógicos puros, las variables se vinculan a expresiones y mantienen un único valor durante toda su vida útil debido a los requisitos de transparencia referencial". - Wikipedia
Gracias!
Por favor aprenda a formatear su código. – Marcin
Lo haré, mis disculpas – Jarmex
No hay necesidad de disculparse - SO realmente no hace un buen trabajo advirtiendo a los nuevos usuarios que deben hacer eso, por lo que casi todos los usuarios nuevos deben ser informados en algún momento. – Marcin