ST monad声明的语法

pla*_*ian 8 haskell st-monad

我最近开始在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) }})
Run Code Online (Sandbox Code Playgroud)

特别是,我不明白(# new_s, r #).我假设第二个哈希是指一个未装箱的值,但其余的对我来说是一个谜(大概与"新状态"有关).

ama*_*loy 7

(# x, y, z #)是一个带有三个元素的无盒子元组.请参阅https://downloads.haskell.org/~ghc/6.8.3/docs/html/users_guide/primitives.html上的 "8.2.2.未装箱的元组" .

其余的基本上只是国家的实施.

  • 一般来说,Haskell中的`#`意味着它正在做某种低级和/或原始的东西.您必须启用`MagicHash`语言扩展,甚至在名称中使用`#`. (3认同)