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)
任何人都可以解释为什么会发生这种情况?在这两种情况下,对象的行为方式是什么?
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)