2012-02-03 13 views
3

returnIOは、OOHaskellでメソッドのレコードとしてオブジェクトを返すために使用されます。しかし、を使用しても、returnIOの代わりにを返しても、出力またはオブジェクトの動作に違いはありません。 OOHaskellのコードは:OO HaskellでのreturnとreturnIOの違い

{-# 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 

誰でもこの現象が起こっている理由を説明できますか?どちらの場合でもオブジェクトが同じように動作するのは何ですか?

答えて

5

returnIOreturnですが、IOタイプに特化しました。

return :: Monad m => a -> m a 
returnIO ::   a -> IO a 

参照ラインOOHaskell.hsの75-76:ある

returnIO :: a -> IO a 
returnIO = return 
+1

推論この余分な方法を提供するためには、より良いエラーメッセージの希望である可能性があります。 –

関連する問題