2010-02-15 22 views
16

Studiuję bibliotekę mtl i próbuję zrobić własne MonadTransformatory. Sprawdzałem deklarację Control.Monad.State.StateT, a we wszystkich kodu, widzę tę składnię:Co znaczy "~" w Haskell?

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

Co to ~ argumentu oznacza?

Odpowiedz

14

To jest notacja dla leniwego wzoru w Haskell. Nie mogę powiedzieć, że jestem z nim zapoznać, ale from here:

nazywany jest leniwy wzór i ma formularz ~ pat. Leniwe wzory są niezastąpione: pasujące do wartości v przeciwko ~ pat zawsze się udaje, niezależnie od pat. Operacyjnie rzecz biorąc, jeśli identyfikator w pat jest później „używane” na prawostronną stroną zostanie on zobowiązany do tej części wartość, która spowodowałaby, jeśli v były z powodzeniem dopasować pat, a ⊥ Inaczej.

Może być przydatny również this section.

4

To odpowiednik

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

lub

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

Dla normalnego wzorca meczu, wartości, które powinny być dopasowane musi być ocenione, tak że może być porównywana z wzorca.

~ oznacza dopasowanie luźnego wzorca: zakłada się, że wartość będzie pasować do wzorca. Dopasowanie jest wtedy wykonywane tylko później, jeśli wartość dopasowanej zmiennej jest rzeczywiście używana.