Haskell: actual IO monad implementation, in different language?

后端 未结 7 977
梦如初夏
梦如初夏 2020-12-08 08:24

How is IO monad actually implemented?in sense of, what would be the actual implementation of the main function?

How would I call haskell function (IO) f

7条回答
  •  暖寄归人
    2020-12-08 08:53

    Below is the actual implementation of IO in GHC 7.10.

    The IO type is essentially a state monad at type State# RealWorld (defined in GHC.Types):

    {- |
    A value of type @'IO' a@ is a computation which, when performed,
    does some I\/O before returning a value of type @a@.
    There is really only one way to \"perform\" an I\/O action: bind it to
    @Main.main@ in your program.  When your program is run, the I\/O will
    be performed.  It isn't possible to perform I\/O from an arbitrary
    function, unless that function is itself in the 'IO' monad and called
    at some point, directly or indirectly, from @Main.main@.
    'IO' is a monad, so 'IO' actions can be combined using either the do-notation
    or the '>>' and '>>=' operations from the 'Monad' class.
    -}
    newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
    

    The IO monad is strict, because bindIO is defined by case matching (defined in GHC.Base):

    instance  Monad IO  where
        {-# INLINE return #-}
        {-# INLINE (>>)   #-}
        {-# INLINE (>>=)  #-}
        m >> k    = m >>= \ _ -> k
        return    = returnIO
        (>>=)     = bindIO
        fail s    = failIO s
    
    returnIO :: a -> IO a
    returnIO x = IO $ \ s -> (# s, x #)
    
    bindIO :: IO a -> (a -> IO b) -> IO b
    bindIO (IO m) k = IO $ \ s -> case m s of (# new_s, a #) -> unIO (k a) new_s
    

    This implementation is discussed in a blog post by Edward Yang.

提交回复
热议问题