Прямой перевод вашего кода в haskell довольно глуп, но, конечно, возможен (как показано в ответе Даниэля).
Обычно, когда вы работаете с состоянием в haskell, вы можете работать с 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.Если вы хотите это, есть хорошая библиотека для взлома, которую вы можете использовать: 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-язык.