Niedawno zacząłem przeglądać biblioteki rdzeniowe w Hackage i istnieje powtarzający się język, którego nie rozumiem. Oto przykład z ST module:składnia deklaracji monady ST
instance Monad (ST s) where
{-# INLINE (>>=) #-}
(>>) = (*>)
(ST m) >>= k
= ST (\ s ->
case (m s) of { (# new_s, r #) ->
case (k r) of { ST k2 ->
(k2 new_s) }})
W szczególności nie rozumiem (# new_s, r #)
. Zakładam, że drugi hash odnosi się do nieskrępowanej wartości, ale reszta jest dla mnie tajemnicą (prawdopodobnie coś związanego z "nowym stanem").
Ogólnie rzecz biorąc, '#' w Haskell oznacza, że robi coś w rodzaju niskiego poziomu i/lub prymitywów. Musisz włączyć rozszerzenie językowe 'MagicHash', aby używać nawet' # 'w nazwach. – Lazersmoke