將代碼直接翻譯成haskell是相當愚蠢的,但當然可能(如Daniel的回答所示)。
通常,當您在haskell中使用狀態時,您可能可以使用State Monad
。只要你在State Monad內執行,你就可以查詢和更新你的狀態。如果你希望能夠做一些IO(如你的例子),你需要在IO之上堆疊你的State Monad。
使用這種方法,你的代碼可能是這樣的:
import Control.Monad.State
import Prelude hiding(read)
increment = modify (+1)
load = put
read = get
normal :: StateT Int IO()
normal = do
load 5
x <- read
lift (print x)
increment
x <- read
lift (print x)
main = evalStateT normal 0
但在這裏你不必爲你的numberClass一個明確的類型。如果你想要這個,你可以使用一個很好的hackage庫:data-lenses。
使用鏡頭的代碼可能會有點接近你的C++版本:
{-# LANGUAGE TemplateHaskell #-}
import Control.Monad.State(StateT,evalStateT,lift)
import Prelude hiding(read)
import Data.Lens.Lazy((~=),access,(%=))
import Data.Lens.Template(makeLenses)
data Number = Number {
_value :: Int
} deriving (Show)
$(makeLenses [''Number])
increment = value %= succ
load x = value ~= x
read = access value
withLens :: StateT Number IO()
withLens = do
load 5
x <- read
lift $ print x
increment
x <- read
lift $ print x
main = evalStateT withLens (Number 0)
不過,確實不是你的代碼...但是嗯,這是Haskell和尚未另一個OO語言。
這是功課嗎?作爲第一步,嘗試重構C++代碼以消除變量。 – harpo
如果這是家庭作業,有人應該用溼鮭魚給老師打耳光。整整一個月。 –