将C代码转换为Haskell

| 如何将这部分C代码转换为Haskell?据我所知,我必须使用State monad,但我不知道如何使用。
int x = 1;
int y = 2;
x =  x * y;
y = y + x;
    
已邀请:
        文字翻译将使用IORefs:
import Data.IORef

main :: IO ()
main = do x <- newIORef 1
          y <- newIORef 2
          y_val <- readIORef y
          modifyIORef x (\\v -> v * y_val)
          x_val <- readIORef x
          modifyIORef y (\\v -> v + x_val)
如您所见,在Haskell中,命令式编程很丑陋。这是有意的,以哄骗您使用功能样式。但是,您可以定义一些辅助函数,以使其更易于使用:
import Data.IORef

-- x := f x y
combineToR :: (a -> t -> a) -> IORef a -> IORef t -> IO ()
combineToR f x y = do y_val <- readIORef y
                      modifyIORef x (\\v -> f v y_val)

addTo :: Num a => IORef a -> IORef a -> IO ()
addTo = combineToR (+)

multWith :: Num a => IORef a -> IORef a -> IO ()
multWith = combineToR (*)

main :: IO ()
main = do x <- newIORef 1
          y <- newIORef 2
          multWith x y
          addTo y x
    
        假设您有一对整数作为状态:
f = do put (1,2)
       modify (\\(x,y) -> (x*y,y))
       modify (\\(x,y) -> (x,y+x))
那是你要的吗?     
        功能语言的意义在于您不要这样做,获得新价值或使用递归。 如果您只想打印这些值,
x = 1
y = 2
a = x*y
b = y+x

main = do
           putStrLn (\"x*y: \" ++ a)
           putStrLn (\"y+x: \" ++ b)
如果这是一项家庭作业,请标记为“我将更改答案”。     
        另一种方法是考虑变量的“ versions”-开头的x与结尾的x不同。例如,在C语言中,您有一个变量,有时会以华氏度存储数字,然后将其转换为摄氏,如下所示:   温度= 40;   temp = convertFtoC(temp); 那么您可以将它们视为两个不同的变量:    tempF = 40;    tempC = convertFtoC(tempF); 不知道您的x和y是什么为他们发明更好的名称,您可能最终会写成haskell: xa = 1; ya = 2; xb = xa * ya; yb = ya + xb; 在某些情况下,这可能是考虑如何使代码更具功能性和减少命令性的好方法。     
        如果使用元组标识\“ mutable \\”变量,则可以在其上定义转换操作并将其\“ chain \”在一起:
vars x y = (x,y)
setX (x,y) x\' = (x\', y) 
setY (x,y) y\' = (x, y\') 
appX (x,y) f = (f x, y)
appY (x,y) f = (x, f y)
app2X (x, y) f = (f x y, y)
app2Y (x, y) f = (x, f x y)
set...
设置一个值,
app...
在其上应用一个函数,
app2...
在两个值上应用一个函数并将其存储在x或y中。然后,您可以执行以下操作:
(vars 3 5) `setX` 14 `appY` (2*)
-- result: (14,10)
您的示例将变为:
(vars 1 2) `app2X` (*) `app2Y` (+)  
-- result: (2,4)
当然,这稍微扩展了“可变”的定义,但是这个解决方案已经是to11ѭ或
Writer
monad的一半。     

要回复问题请先登录注册