【问题标题】:Problems with writing a programm in Haskell with signature IO[(Int, Int)]在 Haskell 中使用签名 IO[(Int, Int)] 编写程序的问题
【发布时间】:2012-06-13 23:29:26
【问题描述】:

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

*Main> 拍摄

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

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

【问题讨论】:

    标签: haskell input io


    【解决方案1】:

    您究竟想让 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
    

    【讨论】:

    • 很好的答案,因为这个问题让你继续下去。
    • 空字符串应该返回0的行长,不是吗?
    • 视情况而定。由于程序在空字符串上终止,输出中唯一可能出现零的位置是在最终位置,并且由于空字符串是唯一导致程序终止的东西,every输出的最终位置为零。所以你不妨把它排除在外。
    • 谢谢。真的行!现在我试着用它来做同样的事情,什么是任务。为什么我想获取对列表?我的老师想要这样。在任务中,如果有奇数行,它确实应该返回 0。
    猜你喜欢
    • 2011-07-02
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多