1

我对程序有一个真正的问题,应该用签名 IO[(Int, Int)] 编写。对我来说,作为真正的初学者,很难理解它应该是什么样子。所以,这是任务:您应该编写一个从用户获取行直到空行的过程。之后它应该返回每行长度。我尝试通过示例使其更易于理解

*主要>采取

kdfdfdf

dfdfeer

错误的

[(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 -}

我会很高兴,如果有人让我明白如何写这个

4

1 回答 1

5

你到底想让 Read 做什么?由于某些原因,它不会编译。您不能命名以大写字母开头的函数或常量,它们是为 Data 构造函数保留的。另外,我相信你知道,但该行在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

这将提示用户输入一行,如果它是一个空行,那么它将返回一个空列表,假设您不关心停止交互所需的空行的长度。否则,它将递归并将线的长度添加到计算的 lineLengths 列表中。

编辑:

如果你真的想要一个配对列表,我认为最好的方法可能是使用像这样的另一个函数。

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
于 2012-06-11T01:56:08.183 回答