Синтаксис объявления монады ST
Недавно я начал изучать основные библиотеки на Hackage, и есть повторяющаяся идиома, которую я не понимаю. Вот пример из модуля 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) }})
В частности я не понимаю (# new_s, r #)
, Я предполагаю, что второй хэш относится к незарегистрированному значению, но остальное для меня загадка (возможно, что-то связанное с "новым состоянием").
1 ответ
Решение
(# x, y, z #)
это незагруженный кортеж с тремя элементами. См. "8.2.2. Распакованные кортежи" по адресу https://downloads.haskell.org/~ghc/6.8.3/docs/html/users_guide/primitives.html.
Остальное в основном просто реализация государства.