2010-02-15 18 views
16

Estoy estudiando la biblioteca mtl y tratando de hacer algunos MonadTransformers propios. Estaba revisando la declaración Control.Monad.State.StateT, ya través de todo el código, veo esta sintaxis:¿Qué significa `~` en Haskell?

execStateT :: (Monad m) => StateT s m a -> s -> m s 
execStateT m s = do 
    ~(_, s') <- runStateT m s 
    return s' 

¿Qué significa esto ~ operando?

Respuesta

14

Esta es la notación de un patrón flojo en Haskell. No puedo decir que estoy familiarizado con él, pero from here:

Se llama un patrón perezoso, y tiene la forma ~ pat. Los patrones diferidos son irrefutables: igualar un valor v contra ~ pat siempre tiene éxito, independientemente de pat. Operativamente hablando, si un identificador en la patente es tarde "usado" en la mano del lado derecho, quedará vinculado a la parte de el valor que resultaría si v eran para que coincida con éxito pat, y ⊥ de otra manera.

Además, this section puede ser útil.

4

Es equivalente a

execStateT m s = do 
    r <- runStateT m s 
    return (snd r) 

o

execStateT m s = 
    runStateT m s >>= return . snd 
7

Para una coincidencia de patrón normal, el valor que debe ser igualada necesita ser evaluada, de modo que puede ser comparado con el patrón.

~ denota una coincidencia de patrón diferida: Se supone que el valor coincidirá con el patrón. La coincidencia solo se realiza luego, si realmente se usa el valor de una variable coincidente.