使用签名IO [(Int,Int)]在Haskell中编写程序的问题

时间:2012-06-11 01:17:42

标签: haskell input io

我有一个关于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 -}

如果有人让我明白如何写这个

,我会很高兴的

1 个答案:

答案 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