Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Haskell中的setElem更新矩阵_Haskell_Matrix - Fatal编程技术网

如何使用Haskell中的setElem更新矩阵

如何使用Haskell中的setElem更新矩阵,haskell,matrix,Haskell,Matrix,我试图使用Haskell中的函数setElem来更新矩阵,但新值似乎不留在矩阵中。有没有办法用这个函数来解决这个问题 我是Haskell的新手,我需要的是在矩阵中设置一个新值,然后显示更新的矩阵 setElem::a->(Int,Int)->矩阵a->矩阵a 我的代码: import Data.Matrix import System.Random import System.IO import Data.Array table_game = matrix 20 20 $ \(i,j)-

我试图使用Haskell中的函数setElem来更新矩阵,但新值似乎不留在矩阵中。有没有办法用这个函数来解决这个问题

我是Haskell的新手,我需要的是在矩阵中设置一个新值,然后显示更新的矩阵

setElem::a->(Int,Int)->矩阵a->矩阵a

我的代码:

import Data.Matrix
import System.Random
import System.IO 
import Data.Array



table_game = matrix 20 20 $ \(i,j)-> "#"


inputCoordenadas = do       
            putStrLn "Digite -1 -1 para encerrar: "
            putStrLn "Digite a coordenada X: "
            coord_x <- getLine
            putStrLn "Digite a coordenada Y: "
            coord_y <- getLine
            let x = (read coord_x :: Int)
            let y = (read coord_y :: Int)
            if(coord_x == "-1"  && coord_y=="-1") then do 
                putStrLn ("Encerrando o jogo...")
                return ()
            else do 
                print $ setElem "X" (2,2) table_game
                print table_game
                inputCoordenadas


main = do   
    putStrLn "Iniciar jogo|1 - Encerrar jogo|0: "
    buffer <- getLine
    let n = (read buffer :: Int)    


if n==0 then do 
        putStrLn "Encerrando o jogo"
        return ()
 else do
    print table_game
    inputCoordenadas
导入数据。矩阵
导入系统。随机
导入系统.IO
导入数据。数组
表\u游戏=矩阵20 20$\(i,j)->”
inputCoordenadas=do
putStrLn“第1-1段:
putStrLn“Digite a coordenada X:”

coord_xHaskell没有可变变量。最简单(最不抽象)的方法是向函数中添加一个参数:

inputCoordinadas tab = do
    ....
    let newTab = setElem "X" (x,y) tab
    inputCoordinadas newTab
因此,每次调用函数时,都会使用“当前”表调用它。当它调用自身时,会传递一个更新的表


有更奇特的方法可以做到这一点,但这种解决方案也很好,甚至在那些知道奇特方法的人中也比较常见。

Haskell使用纯函数。纯函数不能在上下文之外修改任何内容并防止副作用。你所尝试的是哈斯克尔的罪恶。设置全局变量并尝试对其进行变异是不允许的

基本上,您需要构建代码,以便
inputCoordenadas
函数获取一个桌面游戏(
tg
,在下面我的代码中),打印它,修改它并返回一个新的桌面游戏。只要稍加修改,您的代码应该如下

import Data.Matrix
import System.Random
import System.IO 
import Data.Array

inputCoordenadas tg = do
    print tg
    putStrLn "Digite -1 -1 para encerrar: "
    putStrLn "Digite a coordenada X: "
    coord_x <- getLine
    putStrLn "Digite a coordenada Y: "
    coord_y <- getLine
    let x = (read coord_x :: Int)
    let y = (read coord_y :: Int)
    if(coord_x == "-1"  && coord_y=="-1") then putStrLn "Encerrando o jogo..."
                                          else inputCoordenadas $ setElem "X" (x,y) tg

main = do
    putStrLn "Iniciar jogo|1 - Encerrar jogo|0: "
    buffer <- getLine
    let n = (read buffer :: Int)
    if n==0 then  putStrLn "Encerrando o jogo"
            else  inputCoordenadas $ matrix n n (\(i,j) -> "#")
导入数据。矩阵
导入系统。随机
导入系统.IO
导入数据。数组
inputCoordenadas tg=do
打印tg
putStrLn“第1-1段:
putStrLn“Digite a coordenada X:”

那么你的问题是什么?你的代码不起作用了吗?如果是,怎么做?你有什么错误吗?你得到的结果不正确吗?还有什么?是的,如果您运行代码并更新一些坐标,然后输入其他x y进行更新,您将看到以前的更新丢失。这是我的问题,如何使更新在MatrixTransk中永久性地进行重播!我试图将表传递给函数,但如果我正在执行一些愚蠢的过程,或者它真的不起作用,我不会这样做。我创建了一个名为type Table=Matrix的类型,然后输入Coordinadas::Tabuleiro->Tabuleiro,但在下一阶段似乎不起作用。您需要像
randomRIO(1,n)
这样的
randomRIO函数来随机放置地雷。要获得
m
地雷的随机坐标,你可以像
zipWith(,)(replicateM$randomRIO(1,n))(replicateM$randomRIO(1,n))
那样做,而
n
是电路板的大小。@Redu的解决方案对新手来说可能有点难理解——一次引入了两个不同的概念。但是你可以像他们对西尔瓦说的那样一个接一个地做,现在已经很晚了,所以我只能在睡觉前给你一个提示。到现在为止,您应该知道如何在随机坐标下用40枚地雷填充桌面游戏,以及如何使用用户提供的新地雷坐标进行更新。矩阵类型(table game)的不变性之美意味着您可以通过等式操作符
(==)
检查两个游戏表(一个包含40个随机地雷,另一个通过用户更新获得)。如果他们相等,那么你可以确保玩家已经击中了地雷。如果用户标记了一个没有地雷的单元格,你可以继续猜测。@Talles Silva和yes。。我知道你必须更新空闲单元格以显示相邻地雷的数量,但是没有人阻止你编写一个函数来遍历相邻地雷并计算要显示的地雷数量。“我希望你能做到。”塔勒斯·席尔瓦(Talles Silva)记住,
zipWith(,)(replicateM m$randomRIO(1,n))(replicateM m$randomRIO(1,n))
会给你
m
许多随机地雷,但不能保证它们不会重叠。因此,在桌面游戏中,您可能会得到少于
m
个地雷。这与Haskell无关,而是随机性的本质。消除这一事实在许多方面都是可能的,但至少对于初学者来说,应该是很好的。