3

我正在尝试创建一个允许用户输入字符串列表的函数。该函数采用长度并允许用户输入长度为 1 的更多行。然后检查每一行以确保它与原始行的长度相同。但是,我遇到了一些问题,我找不到解决方案。

问题是我可以输入多于 count-1 行,并且没有按预期计算长度..例如,如果我输入 ["12","13"] 然后 ["121","13" ] 给出了错误,尽管它们的长度相同!

read :: IO [Line]
read = do
  line <- getLine
  let count = length line
  lines <- replicateM (count-1) $ do
    line <- getLine
    if length line /= count
    then fail "too long or too short"
    else return line
  return $ line : lines

行是字符串类型。

readLn 给出一个解析错误。

4

1 回答 1

5

在我看来,您对获取一行作为 aString和读取/解析一行输入作为自定义类型之间的区别感到困惑。您正在使用getLine,它始终返回String用户键入的内容。比较:

Prelude> fmap length getLine
["12","13"]
11
Prelude> length "[\"12\",\"13\"]" -- explanation of the 11
11
Prelude> fmap length (readLn :: IO [String])
["12","13"]
2
Prelude> length ["12", "13"] -- explanation of the 2
2

如此处所示,您可能想要使用readLn,它首先获取一行输入,然后使用read.

-- defined in the Prelude
readLn = do
    s <- getLine
    return (read s)

如果我修改您的代码以包含以下导入和定义:

import Control.Monad
type Line = [String]

...并调用readLn而不是getLine,然后我可以输入文字行["12","13"]并且["121","13"]没有错误。

于 2012-03-12T11:35:29.933 回答