2012-04-16 6 views
6

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!

+0

Por favor aprenda a formatear su código. – Marcin

+0

Lo haré, mis disculpas – Jarmex

+0

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

Respuesta

8

Incluso en idiomas funcionales, hay sombreado de nombres. A veces eso es útil. En el primer código, el (y,z) <- xs sombrea el y obligado por el (x,y) <- xs anterior.

Compile con las advertencias activadas para recibir una alerta de tales cosas.

+3

Gracias por eso, después de su uso de la frase 'sombreado', encontré una pregunta muy similar ya ha sido respondida. http://stackoverflow.com/questions/4053789/variables-in-haskell. Gracias por tu tiempo :) – Jarmex

Cuestiones relacionadas