将代码直接翻译成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
如果这是家庭作业,有人应该用湿鲑鱼给老师打耳光。整整一个月。 –