2012-06-01 4 views
1

Я пытаюсь научиться Haskell привыкать к функциональным языкам программирования. Я решил попробовать несколько проблем на interviewstreet, чтобы начать. У меня проблемы с чтением из stdin и вообще io в целом с ленивым io.Haskell читает первые n строк

Большинство проблем имеют данные, поступающие из стандартного ввода в следующем виде:

n 
data line 1 
data line 2 
data line 3 
... 
data line n 

где п число следующих линий, поступающих из стандартного ввода и последующих линий данных.

Как запустить мою программу по каждой из n строк по одному и вернуть решение для стандартного вывода?

Я знаю, что вход stdin не будет очень большим, но я прошу об оценке каждой строки по одному, делая вид, что вход больше, чем то, что может поместиться в памяти, чтобы узнать, как использовать haskell.

ответ

8

Вы можете использовать interact в сочетании с lines для обработки данных из stdin по одной строке за раз. Вот пример программы, которая использует interact для доступа к stdin, lines, чтобы разделить данные по каждой новой строке, составить список для применения функции perLine к каждой строке ввода и unlines, чтобы снова вернуть результат от perLine.

main = interact processInput 

processInput input = unlines [perLine line | line <- lines input] 

perLine line = reverse line -- do whatever you want to 'line' here! 

Вам не нужно беспокоиться о размере данных, которые вы получаете по stdin; Леность Haskell гарантирует, что вы только сохраните части, на которых вы фактически работаете в памяти в любое время.

EDIT: если вы все еще хотите работать только первые n линии, вы можете использовать функцию take в приведенном выше примере, как это:

processInput input = unlines [perLine line | line <- take 10 (lines input)] 

Это завершит программу после первых десяти строк были прочитаны и обработаны.

+0

Работал красиво – GTDev

Смежные вопросы