如何将这部分C代码转换成Haskell?据我所知,我必须使用国家蒙纳德,但我不知道如何使用。

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

10-07 16:10