2015-05-26 58 views
3

我一直試圖閱讀和理解,實現Haskell的ST單子, 代碼,我發現this code'MutVar#'是什麼意思?

{-# LANGUAGE Unsafe #-} 
{-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples #-} 
{-# OPTIONS_HADDOCK hide #-} 

----------------------------------------------------------------------------- 
-- | 
-- Module  : GHC.STRef 
-- Copyright : (c) The University of Glasgow, 1994-2002 
-- License  : see libraries/base/LICENSE 
-- 
-- Maintainer : [email protected] 
-- Stability : internal 
-- Portability : non-portable (GHC Extensions) 
-- 
-- References in the 'ST' monad. 
-- 
----------------------------------------------------------------------------- 

module GHC.STRef (
     STRef(..), 
     newSTRef, readSTRef, writeSTRef 
    ) where 

import GHC.ST 
import GHC.Base 

data STRef s a = STRef (MutVar# s a) 
--^a value of type @STRef s [email protected] is a mutable variable in state thread @[email protected], 
-- containing a value of type @[email protected] 

-- |Build a new 'STRef' in the current state thread 
newSTRef :: a -> ST s (STRef s a) 
newSTRef init = ST $ \s1# -> 
    case newMutVar# init s1#   of { (# s2#, var# #) -> 
    (# s2#, STRef var# #) } 

-- |Read the value of an 'STRef' 
readSTRef :: STRef s a -> ST s a 
readSTRef (STRef var#) = ST $ \s1# -> readMutVar# var# s1# 

-- |Write a new value into an 'STRef' 
writeSTRef :: STRef s a -> a -> ST s() 
writeSTRef (STRef var#) val = ST $ \s1# -> 
    case writeMutVar# var# val s1#  of { s2# -> 
    (# s2#,() #) } 

-- Just pointer equality on mutable references: 
instance Eq (STRef s a) where 
    STRef v1# == STRef v2# = isTrue# (sameMutVar# v1# v2#) 

我看到了下面這行代碼在上面的代碼文件:

data STRef s a = STRef (MutVar# s a) 

MutVar#快速搜索,得到以下結果:

我的問題是: 什麼是MutVar#?爲什麼它沒有在任何地方定義?這是什麼意思 ?

+1

它似乎是一種原始類型[在GHC中定義](https://github.com/ghc/ghc/blob/90dd11bf1918485f0f19bb2fb764f1675c0f0dd5/compiler/prelude/primops.txt.pp#L1868)。它與用於'IORef's的類型相同,'s'類型參數設置爲'RealWorld#'。 – Cactus

+0

它*是*在某處定義的:它在'GHC.Prim'中。該定義只是一個空白存根;正如其他人所說,真正的實現是硬編碼到編譯器中的。這是一個低級的特定於GHC的實現細節。一個不同的Haskell編譯器可能會以不同的方式實現它。 – MathematicalOrchid

回答

7

MutVar#是由編譯器本身提供的原始類型。它代表了一個可變參考,並形成了IORefSTRef的核心。

一般來說,以#結尾的任何內容都是GHC的實現細節。除非你做低級hackery,否則你不需要擔心它們。大多數這些操作都有包裝器(如ST),它們更易於使用。

您可以在GHC manualghc-prim包中閱讀更多關於這些信息。

+2

實際上,任何'____#'名稱都是基本類型,比如'Int#'等等。你需要'{ - #LANGUAGE MagicHash# - }'來啓用它。 – AJFarmar

+0

@AJFarmar小心這句話。 「所有'___#'名稱都是原始的」[只是一個約定](https://downloads.haskell.org/~ghc/7.10.1/docs/html/users_guide/syntax-extns.html#magic-hash) ;它實際上並沒有被編譯器強制執行。你可以定義你自己的以'#'結尾的函數和類型,GHC不會以任何不同的方式對待它們。 –

+0

的確如此,但Haskell中的約定很好地遵守!儘管如此,這還是值得一提的。 – AJFarmar