Что означает `` `в Haskell?
Я изучаю библиотеку mtl
и пытаюсь сделать некоторые из моих собственных MonadTransformers. Я проверял объявление Control.Monad.State.StateT
, и по всему коду я вижу этот синтаксис:
execStateT :: (Monad m) => StateT s m a -> s -> m s
execStateT m s = do
~(_, s') <- runStateT m s
return s'
Что означает этот операнд ~
?
Ответы
Ответ 1
Это обозначение для ленивого шаблона в Haskell. Я не могу сказать, что я знаком с ним, но отсюда:
Он называется ленивым рисунком и имеет форма ~ pat. Ленивые модели неопровержимый: сопоставление значения v против ~ pat всегда удается, независимо от поглаживания. Оперативно говоря, если идентификатор в pat позже "используется" с правой стороны, он будет связан с той частью значение, которое получилось бы, если v было для успешного совпадения, и ⊥ в противном случае.
Кроме того, этот раздел может быть полезен.
Ответ 2
Для нормального соответствия шаблону необходимо оценить значение, которое должно быть сопоставлено, чтобы его можно было сопоставить с шаблоном.
~
обозначает ленивое совпадение шаблонов: предполагается, что значение будет соответствовать шаблону. Затем совпадение выполняется только позже, если фактически используется значение совпадающей переменной.
Ответ 3
Это эквивалентно
execStateT m s = do
r <- runStateT m s
return (snd r)
или
execStateT m s =
runStateT m s >>= return . snd