2015-11-27 3 views
2

Я пытаюсь прочитать стандартный ввод строки за строкой и обрабатывать каждую строку с помощью функции типа foo :: String -> Int. Есть ли способ сделать это при условии, что мы не знаем количество строк, которые мы хотим прочитать, или учитывая, что количество строк указано в первой строке?Чтение строки по строке в Haskell

Что я пробовал Множество вещей, которые дают бессмысленные ошибки, такие как «ошибка парсера». Например

main = do { 
    getLine <- getContents; 
    let result = show (foo getLine); 
    putStrLn (foo result); 
} 

Edit Странно, но это не печатает длину

main = do { 
    a <- getContents; 
    putStrLn (show (length a)); 
} 

, но это делает печать 5.

main = do { 
    a <- getContents; 
    putStrLn (show 5); 
} 
+1

'getLine' - это встроенная функция в haskell, подумайте о том, чтобы назвать вашу переменную чем-то еще? Кроме того, нотация 'do' не нужна' {} ' –

ответ

0

Вы можете использовать function lines, чтобы преобразовать String в [String]. Впоследствии map ваш foo над этим списком строк.

Относительно редактирования: Ваша программа, печатая длину, работает для меня. Попробуйте либо ввести файл, либо - при вводе ввода в интерактивном режиме - его правильное завершение (через Ctrl-d).

Sidenote: фигурные скобки и точки с запятой редко встречаются обычно. Но это только стиль.

2

Главный пример выполнения, который будет выглядеть следующим образом:

main = do 
    line <- getLine 
    yourfunction line 
    main 

это займет линии навсегда и обрабатывать их с помощью функции, в случае, если вы хотите, чтобы остановить когда-нибудь, просто проверить для команды, например, :

main = do 
    line <- getLine 
    let res = yourfunction line 
    if res == "Exit" then IO() else main