Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 哈斯克尔-试图写尼姆游戏,我得到的错误我不明白_Haskell - Fatal编程技术网

Haskell 哈斯克尔-试图写尼姆游戏,我得到的错误我不明白

Haskell 哈斯克尔-试图写尼姆游戏,我得到的错误我不明白,haskell,Haskell,我试图用Haskell编写游戏nim,但有些东西不起作用,我不知道为什么。 我有两个函数getRow和getNumber(它们都使用getInt,我也包括在内),getRow按照我希望的方式工作,但使用getNumber时,我会出现sobe错误,并且不希望加载 getInt :: Int getInt = do s <- getLine read s getRow :: [Int] -> (Int,Int) getRow board = do putStrLn "

我试图用Haskell编写游戏nim,但有些东西不起作用,我不知道为什么。 我有两个函数getRow和getNumber(它们都使用getInt,我也包括在内),getRow按照我希望的方式工作,但使用getNumber时,我会出现sobe错误,并且不希望加载

getInt :: Int
getInt = do  
  s <- getLine
  read s

getRow :: [Int] -> (Int,Int) 
getRow board = do
  putStrLn "Give me row number "
  row <- getInt
  if ((length board) > (row-1)) && ((board!!(row-1)) > 0 )
    then (row, board!!(row-1))
    else do putStrLn "niepoprawny rzad"
            getRow board

getNumber :: [Int] -> (Int, Int) -> (Int, Int)
getNumber board row = do
  putStrLn "Give me number of stones you want to take"
  number <- getInt
  if number < 1 
    then do putStrLn "wrong number"
            getNumber board row
              else if (number > (snd row)) 
                   then ((fst row), 0)
                   else ((fst row), ((snd row) - number))
getInt::Int
getInt=do
s(Int,Int)
getRow board=do
putStrLn“给我行号”
行(行-1))&((板!!(行-1))>0)
然后(排,板!!(排-1))
“尼波普劳尼·雷扎德”还有其他人吗
getRow板
getNumber::[Int]->(Int,Int)->(Int,Int)
getNumber板行=do
putStrLn“给我你想要的石头数量”
编号(snd行))
然后((fst行),0)
其他((fst行),((snd行)-编号))
在getNumber中,我得到:

 Couldn't match expected type '(Int, Int)' with actual type 'Int' 
 In a stmt of a 'do' block: number <- getInt"
无法将预期类型“(Int,Int)”与实际类型“Int”匹配

在“do”块的stmt:number中,此代码中存在大量普遍存在的错误。最特别的是,纯计算是在
do
块的最后一行完成的——这些必须
return
ed,以便它们最终“在
IO
中”。您的所有类型都没有在
IO
monad中返回。在
getNumber
中的最后一个
if
语句中也可能存在缩进错误

getInt :: IO Int          -- in the IO monad
getInt = do  
  s <- getLine
  return (read s)         -- we must return pure values from monads

getRow :: [Int] -> IO (Int,Int)       -- in the IO monad
getRow board = do
  putStrLn "Give me row number "
  row <- getInt
  if ((length board) > (row-1)) && ((board!!(row-1)) > 0 )
    then return (row, board!!(row-1))   -- we must return pure values from monads
    else do putStrLn "niepoprawny rzad"
            getRow board

getNumber :: [Int] -> (Int, Int) -> IO (Int, Int)   -- in the IO monad
getNumber board row = do
  putStrLn "Give me number of stones you want to take"
  number <- getInt
  if number < 1 
    then do putStrLn "wrong number"
            getNumber board row
    else if (number > (snd row))                           -- better indentation
           then return ((fst row), 0)                      -- we must return
           else return ((fst row), ((snd row) - number))   -- we must return
getInt::IO Int——在IO单子中
getInt=do
IO(Int,Int)——在IO单子中
getRow board=do
putStrLn“给我行号”
行(行-1))&((板!!(行-1))>0)
然后返回(row,board!!(row-1))--我们必须从monad返回纯值
“尼波普劳尼·雷扎德”还有其他人吗
getRow板
getNumber::[Int]->(Int,Int)->IO(Int,Int)--在IO单子中
getNumber板行=do
putStrLn“给我你想要的石头数量”
数字(snd行))--更好的缩进
然后返回((fst行),0)——我们必须返回
否则返回((fst行),((snd行)-number))--我们必须返回

此代码中存在大量普遍存在的错误。最特别的是,纯计算是在
do
块的最后一行完成的——这些必须
return
ed,以便它们最终“在
IO
中”。您的所有类型都没有在
IO
monad中返回。在
getNumber
中的最后一个
if
语句中也可能存在缩进错误

getInt :: IO Int          -- in the IO monad
getInt = do  
  s <- getLine
  return (read s)         -- we must return pure values from monads

getRow :: [Int] -> IO (Int,Int)       -- in the IO monad
getRow board = do
  putStrLn "Give me row number "
  row <- getInt
  if ((length board) > (row-1)) && ((board!!(row-1)) > 0 )
    then return (row, board!!(row-1))   -- we must return pure values from monads
    else do putStrLn "niepoprawny rzad"
            getRow board

getNumber :: [Int] -> (Int, Int) -> IO (Int, Int)   -- in the IO monad
getNumber board row = do
  putStrLn "Give me number of stones you want to take"
  number <- getInt
  if number < 1 
    then do putStrLn "wrong number"
            getNumber board row
    else if (number > (snd row))                           -- better indentation
           then return ((fst row), 0)                      -- we must return
           else return ((fst row), ((snd row) - number))   -- we must return
getInt::IO Int——在IO单子中
getInt=do
IO(Int,Int)——在IO单子中
getRow board=do
putStrLn“给我行号”
行(行-1))&((板!!(行-1))>0)
然后返回(row,board!!(row-1))--我们必须从monad返回纯值
“尼波普劳尼·雷扎德”还有其他人吗
getRow板
getNumber::[Int]->(Int,Int)->IO(Int,Int)--在IO单子中
getNumber板行=do
putStrLn“给我你想要的石头数量”
数字(snd行))--更好的缩进
然后返回((fst行),0)——我们必须返回
否则返回((fst行),((snd行)-number))--我们必须返回

检查缩进。也请张贴完全相同的源代码。Pastebin会很好的。为什么所有的东西都在do块中?Do只适用于单子,除非我遗漏了什么,否则元组不是一。你到处都缺少
IO
。一本好的哈斯克尔书不是个坏主意,因为你似乎混淆了很多概念,试着向你学习一本好的哈斯克尔书。麦斯不允许我再缩进一次。如果没有monad,我会很高兴,但是当我使用getLine时,Emacs会让我使用monad。如果我试图返回monad,我不知道如何将它赋给另一个函数,而且我无法从IO获取intInts@AgnesHaskell有一段相当长的学习曲线,它需要一段时间才能真正适应它的编程风格,而且它并不适合所有人(正如我不喜欢Java,但它显然是一种广泛使用的语言)。不要因为一开始很难理解而忽视这门语言,因为它有很多好处会在以后出现。我甚至能够将从Haskell中学到的经验应用到我的Python和.NET代码中。这无疑是一种迫使我学习编程新知识的语言,而不是像所有主流语言一样。也请张贴完全相同的源代码。Pastebin会很好的。为什么所有的东西都在do块中?Do只适用于单子,除非我遗漏了什么,否则元组不是一。你到处都缺少
IO
。一本好的哈斯克尔书不是个坏主意,因为你似乎混淆了很多概念,试着向你学习一本好的哈斯克尔书。麦斯不允许我再缩进一次。如果没有monad,我会很高兴,但是当我使用getLine时,Emacs会让我使用monad。如果我试图返回monad,我不知道如何将它赋给另一个函数,而且我无法从IO获取intInts@AgnesHaskell有一段相当长的学习曲线,它需要一段时间才能真正适应它的编程风格,而且它并不适合所有人(正如我不喜欢Java,但它显然是一种广泛使用的语言)。不要因为一开始很难理解而忽视这门语言,因为它有很多好处会在以后出现。我甚至能够将从Haskell中学到的经验应用到我的Python和.NET代码中。这无疑是一种迫使我学习编程新知识的语言,而不是像所有主流语言一样。