2012-01-19 54 views
2

C++代碼是:我怎麼可以重寫或本C++代碼轉換爲Haskell代碼,我想重寫或轉換

class numberClass 
{ 
    private: 
    int value; 
    public: 
    int read() 
    { 
     return value; 
    } 
    void load(int x) 
    { 
     value = x; 
    } 
    void increment() 
    { 
     value= value +1; 
    } 
}; 

int main() 
{ 
    numberClass num; 
    num.load(5); 
    int x=num.read(); 
    cout<<x<<endl; 
    num.increment(); 
    x=num.read(); 
    cout<<x; 
} 

我不知道該怎麼做任何實體(如在C++中的變量),其可以在整個Haskell程序中保持價值。

請幫忙。 謝謝

+0

這是功課嗎?作爲第一步,嘗試重構C++代碼以消除變量。 – harpo

+11

如果這是家庭作業,有人應該用溼鮭魚給老師打耳光。整整一個月。 –

回答

8

好吧,假設它的包裝,而不是可變性,你就可以輕鬆擁有一個類型,只允許建設的恆定值及增量:

module Incr (Incr, incr, fromIncr, toIncr) where 

newtype Incr a = Incr a deriving (Read, Show) 

fromIncr :: Incr a -> a 
fromIncr (Incr x) = x 

incr :: (Enum a) => Incr a -> Incr a 
incr (Incr x) = Incr (succ x) 

toIncr :: a -> Incr a 
toIncr = Incr 

由於Daniel指出,可變性是不可能的,但類的另一個目的是封裝,這個模塊就像C++類一樣。當然對於一個Haskell程序員來說,這個模塊可能看起來並不是很有用,但是也許你有一些用例,想要靜態地阻止庫用戶使用常規的加法或乘法。

10

基本上,你不能。值是不可變的,Haskell在存儲值的框的意義上沒有變量,比如C++和類似的。你可以使用IORef s(它們是你可以存儲值的方框)做類似的事情,但是使用它們幾乎總是錯誤的設計。

Haskell是不同的編程語言,嘗試將代碼從C,C++,Java等語言翻譯成Haskell並不是一個好主意。必須從不同的角度來看待這些任務,並以不同的方式來處理它。

話雖這麼說:

module Main (main) where 

import Data.IORef 

main :: IO() 
main = do 
    num <- newIORef 5 :: IO (IORef Int) 
    x <- readIORef num 
    print x 
    modifyIORef num (+1) 
    x <- readIORef num 
    print x 
2

將代碼直接翻譯成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語言。

相關問題