Haskell IO Recursion - PullRequest
       15

Haskell IO Recursion

3 голосов
/ 12 марта 2012

У меня есть код:

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

То, что я хочу сделать, это на основе длины первой строки, которую пользователь должен ввести в длину-еще 1 строка, также, если какая-либо из этих строкне такой длины, как исходная строка, будет отображаться сообщение об ошибке.

В данный момент мой код представляет собой просто бесконечный цикл, так как я не могу понять, как вводить длину - еще 1 строка.Некоторые рекомендации для этого будут оценены.

Редактировать: строка имеет тип String

1 Ответ

5 голосов
/ 12 марта 2012

Вы можете использовать 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
...