OO Haskell中return和returnIO之间的区别

Rog*_*ews 3 haskell

returnIO在OOHaskell中用于返回对象作为方法的记录.但即使使用return而不是returnIO,输出或对象行为也没有区别.OOHaskell代码是:

{-# LANGUAGE EmptyDataDecls, DeriveDataTypeable, TemplateHaskell #-}
{-# OPTIONS_GHC -fcontext-stack=100 #-}

module Rectangle where

import OOHaskell

$(label "getLength")
$(label "getWidth")
$(label "incr")
$(label "lengthenBy")
$(label "setLength")
$(label "setWidth")
$(label "show'")

rectangle length width self
 = do
     lengthRef <- newIORef length :: IO (IORef Int)
     widthRef <- newIORef width :: IO (IORef Int)
     return $
          getLength      .=. readIORef lengthRef
      .*. getWidth      .=. readIORef widthRef
      .*. setLength      .=. writeIORef lengthRef
      .*. setWidth      .=. writeIORef widthRef
      .*. lengthenBy    .=. (\dl ->
              do
             length <- self # getLength
             (self # setLength) (length + dl))
      .*. incr          .=. (self # lengthenBy) (1)
      .*. show'         .=. printLn ("Length : "<< self # getLength<<" Width : "<< self # getWidth)
      .*. emptyRecord
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会发生这种情况?在这两种情况下,对象的行为方式是什么?

dav*_*420 5

returnIO return,但专门针对IO类型.

那是:

return   :: Monad m => a ->  m a
returnIO ::            a -> IO a
Run Code Online (Sandbox Code Playgroud)

OOHaskell.hs第75-76 :

returnIO :: a -> IO a
returnIO = return
Run Code Online (Sandbox Code Playgroud)