我有一个关于programm的实际问题,应该用签名IO [(Int,Int)]编写。 对我来说,作为初学者,很难理解它应该是什么样子。 所以,这是任务: 你应该编写一个带有用户线的程序,直到空行。之后它应该返回每一行长度。我尝试用例子
使其更容易理解*主>取
kdfdfdf
dfdfeer
ererere
[(7,7),(7,0)]
阅读部分它是可以理解的,除非它实际上并不像我想要的那样工作
Read
= do
putStrLn "User, your turn!"
line <- getLine
if line==""
then return ...
else do
line <-Read
return line {- actually doesn't return a line -}
如果有人让我明白如何写这个
,我会很高兴的答案 0 :(得分:5)
你到底想要什么读书?因为它有几个原因不会编译。您不能将函数或常量命名为以大写字母开头,这些是为数据构造函数保留的。另外,我相信你知道,但是行return ...
在Haskell中不是有效的语法。
我真的不明白为什么你想要一个对列表,如果你只想返回每行的长度,那么这样的东西就可以了。
lineLengths :: IO [Int]
lineLengths = do
putStrLn "User, your turn!"
line <- getLine
if line == ""
then return []
else do
moreLines <- lineLengths
return $ (length line) : moreLines
这将提示用户输入一行,如果它是一个空行,那么它将返回一个空列表,假设您不关心停止交互所需的空行长度。否则它将递归并将该行的长度添加到计算的lineLength列表中。
编辑:
如果你真的想要一对配对列表,我认为最好的方法可能是使用另一个这样的函数。
toPairs :: [Int] -> [(Int,Int)]
toPairs [] = []
toPairs [x] = [(x,0)]
toPairs (x:y:zs) = (x,y) : toPairs zs
然后将它与阅读功能结合起来我们可以这样做:
lineLengthPairs :: IO [(Int,Int)]
lineLengthPairs = do
ls <- lineLengths
return $ toPairs ls