Haskell IO递归

gdr*_*les 3 io recursion haskell

我有代码:

read :: IO [Line]
read = do
  line <- getLine
  let count = length line
  line2 <- getLine 
  if (length line2 /= count) 
  then error "too long or too short"
  else read
Run Code Online (Sandbox Code Playgroud)

我想要做的是,基于第一行的长度,用户必须输入长度为1的行,如果这些行中的任何行与原始行的长度不同,则将显示错误消息.

现在我的代码只是一个无限循环,因为我无法弄清楚如何输入长度为1的行.对此的一些指导将不胜感激.

编辑:行的类型为String

Lil*_*ard 5

您可以使用replicateM一定次数复制操作并收集结果.在你的情况下,动作是抓取一条线,测试它的长度,如果它无效则出错.所以你可以使用类似下面的东西来完成你的工作:

import Control.Monad (replicateM)

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
Run Code Online (Sandbox Code Playgroud)

  • replicateM工作正常,如果有问题,它可能在你的其余代码中.当标准的简单代码完全失败时,这是合理的选择:不要责怪标准函数并在自己的代码中查找错误.如果您仍然找不到错误,请将您的代码显示给一些经验丰富的Haskeller,此处或#haskell.如果他们仍然找不到错误,那么就该开始怀疑标准库了. (2认同)