2012-01-19 37 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语言。

相关问题