Haskell 哈斯克尔-试图写尼姆游戏,我得到的错误我不明白
我试图用Haskell编写游戏nim,但有些东西不起作用,我不知道为什么。 我有两个函数getRow和getNumber(它们都使用getInt,我也包括在内),getRow按照我希望的方式工作,但使用getNumber时,我会出现sobe错误,并且不希望加载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 "
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代码中。这无疑是一种迫使我学习编程新知识的语言,而不是像所有主流语言一样。