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.