Подтвердить что ты не робот

Что означает `` `в 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'

Что означает этот операнд ~?

4b9b3361

Ответ 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