lists guards functions syntax haskell pattern-matching

syntax - guards - ¿Qué significa "~" en Haskell?



haskell lists (3)

Estoy estudiando la biblioteca de mtl e intentando hacer algunos MonadTransformers propios. Estaba revisando la declaración Control.Monad.State.StateT , y en todo el código, veo esta sintaxis:

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

¿Qué significa este ~ operando?


Es equivalente a

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

o

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


Esta es la notación para un patrón perezoso en Haskell. No puedo decir que estoy familiarizado con esto pero desde aquí :

Se llama patrón perezoso y tiene la forma ~ pat. Los patrones perezosos son irrefutables: la coincidencia de un valor v con ~ pat siempre tiene éxito, independientemente de la pat. Hablando operativamente, si un identificador en pat es "usado" más adelante en el lado derecho, se vinculará a esa parte del valor que resultaría si v fuera a coincidir con pat, y ⊥ de lo contrario.

Además, esta sección puede ser útil.


Para una coincidencia de patrón normal, el valor que debe coincidir debe evaluarse, de modo que pueda compararse con el patrón.

~ denota una coincidencia de patrón perezoso: solo se supone que el valor coincidirá con el patrón. La coincidencia se realiza solo más tarde, si el valor de una variable coincidente se utiliza realmente.