2011-07-05 15 views
5

Como Erlang es un lenguaje de programación funcional casi puro, me imagino que esto era posible:patrón de Erlang a juego con las funciones

case X of 
    foo(Z) -> ... 
end. 

donde foo(Z) es una (libre de efectos secundarios) biyectiva decidable-invertible pura función, por ejemplo:

foo(input) -> output. 

Entonces, en el caso de que X = output, Z coincidiría como input.

¿Es posible utilizar dicha semántica, con o sin otra sintaxis que mi ejemplo, en Erlang?

Respuesta

1

No, Erlang sólo es compatible con los patrones literales!

Y su solicitud original no es fácil. El hecho de que haya una inversa no significa que sea fácil de encontrar. Prácticamente sería que el compilador tendría que hacer dos versiones de funciones.

4

No, lo que desea no es posible.

Para hacer algo como esto necesitarías poder encontrar el inverso de cualquier función biyectiva, que es obviamente indecidible.

+3

@Pindatjuh: Sé lo que es una función biyectiva. Pero el hecho de que cada función biyectiva tenga una inversa no significa que pueda escribir un algoritmo para encontrarla (no puede). – sepp2k

+0

Editaré la pregunta: una función biyectiva pura invertible. – Pindatjuh

2

Supongo que la razón por la que no está permitido es porque desea garantizar la ausencia de efectos secundarios. Dada la siguiente estructura:

case Expr of 
    Pattern1 [when GuardSeq1] -> 
     Body1; 
    ...; 
    PatternN [when GuardSeqN] -> 
     BodyN 
end 

Después de evaluar Expr, los patrones se hacen coincidir secuencialmente contra el resultado de Expr. Imagine que su función foo/1 contiene un efecto secundario (por ejemplo, envía un mensaje):

foo(input) -> 
    some_process ! some_msg, 
    output. 

Incluso si el primer patrón no coincidiría, que habría enviado el mensaje de todos modos y no pudo recuperarse de esa situación.

+0

Gracias, sin embargo, quise decir con "función pura" que no está permitido tener efectos secundarios. Voy a editar la pregunta. – Pindatjuh

+1

Entiendo eso. El problema, sin embargo, es cómo garantizar que la función sea pura, cuando esté definida por el usuario. –

1

Lo que puede hacer es:

Y = foo(Z), 
case X of 
    Y -> ... 
end. 
+2

Eso requiere que sepas el valor de Z sin embargo. Estoy bastante seguro de que eso no es lo que el OP pretendía. – sepp2k

+0

Bueno, si uno reemplaza 'foo' con' foo_inverse', tiene sentido. Sin embargo, como dijo sepp2k, eso no es lo que pretendía. – Pindatjuh

Cuestiones relacionadas