Что значит `~` в Хаскеле? - PullRequest
17 голосов
/ 15 февраля 2010

Я изучаю библиотеку mtl и пытаюсь создать несколько собственных монадрансформаторов. Я проверял объявление Control.Monad.State.StateT, и во всем коде я вижу этот синтаксис:

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

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

Ответы [ 3 ]

14 голосов
/ 15 февраля 2010

Это обозначение для ленивого шаблона в Haskell. Не могу сказать, что знаком с этим, но отсюда :

Это называется ленивым узором и имеет форма ~ пат. Ленивые узоры неопровержимый: соответствует значение v против пэта всегда получается, независимо от пат. Оперативно говоря, если идентификатор в пат позже "используется" на правой стороне, это будет связано с этой частью значение, которое получилось бы, если бы V чтобы успешно соответствовать Пэт и ⊥ в противном случае.

Также, этот раздел может быть полезен.

8 голосов
/ 18 февраля 2010

Для нормального сопоставления с шаблоном необходимо оценить значение, которое должно быть сопоставлено, чтобы его можно было сравнить с шаблоном.

~ обозначает ленивое сопоставление с образцом: просто предполагается, что значение будет соответствовать образцу. В этом случае сопоставление выполняется только позже, если фактически используется значение сопоставляемой переменной.

4 голосов
/ 15 февраля 2010

Это эквивалентно

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

или

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