2010-11-04 15 views
8

En Prolog, podemos hacer algo como lo siguiente:coincidencia de patrones variables de equivalentes en Haskell, como en Prolog

myFunction a (a:xs) = ... 

Esto es, cuando la primera discusión de myFunction es el mismo que el primer elemento de la lista eso está en el segundo argumento, esta función evaluará a ....

Mi pregunta ahora es ... ¿cómo lograr algo similar en Haskell? Tengo la idea de que Prolog's Pattern Matching es más expresivo que Haskell's. He estado intentando codificar eso en Haskell y estoy teniendo problemas, o estoy usando una sintaxis no válida o el truco anterior simplemente no funcionará.

Respuesta

13

Haskell no hace este tipo de "coincidencia variable". Vas a tener que poner un guardia de forma explícita en:

myFunction a (x:xs) 
    | x == a = ... 
8

En Haskell, no se puede hacer comparaciones implícitas de este tipo en una coincidencia de patrón. En su lugar, tendrá que añadir un guardia, que hace explícita la comparación, así:

myFunction a (b:xs) | a == b = ... 
12

Haskell no hace unificación de variables, como lo hace Prolog. Como dice el Haskell 98 report,

El conjunto de patrones correspondientes a cada partido debe ser lineal --- se permite ninguna variable a aparecer más de una vez en todo el conjunto.

Usted puede nombrar, por supuesto, las variables, y el estado en el que también debe ser igual:

f a (b:_) | a == b = ... 

Curiosamente, Agda deja entrar el flujo de información a través de los patrones de este tipo, e introduce una notación especial f x (.x:_) para decir que este x debe ser ese x.

+1

En scala puede usar 'x' para denotar un patrón que coincida con el valor de una variable como el caso de agda también. –

Cuestiones relacionadas