2017-04-07 12 views
7

最近私は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 #)を理解していない:ここでST moduleからの例です。私は、2番目のハッシュがボックス化されていない値を参照していると仮定しますが、残りは私にとって謎です(おそらく "新しい状態"と関係がある)。

答えて

7

(# x, y, z #)は、3つの要素を持つボックス化されていないタプルです。 「8.2.2。ボックス化されていないタプル」(https://downloads.haskell.org/~ghc/6.8.3/docs/html/users_guide/primitives.html)を参照してください。

残りは、基本的にはStateの実装です。

+3

一般的に、Haskellの '# 'は、ある種の低レベルやプリミティブなことをしていることを意味します。名前に '#'を使用するには、MagicHash言語拡張を有効にする必要があります。 – Lazersmoke

関連する問題