Параметры совместного использования ввода-вывода Haskell

#haskell #syntax #io

#haskell #синтаксис #io

Вопрос:

В Haskell возможно ли передавать пользовательский ввод из одной функции ввода-вывода в другую?

Например, если бы у меня:

   main = do
         putStrLn "Give me a number!"
         my_stuff <- getLine 
         let nump = read (my_stuff)::Int
         another_function nump
 

Где another_function также является функцией ввода-вывода с do конструкцией.

 another_function nump = do
                          putStrLn nump
                          putStrLn "Try again!"
                          main
 

Это имело бы смысл в интерпретаторе Haskell в фантастическом мире, который у меня в голове. Однако в реальном мире: my_stuff не привязан к another_function; и в main my_stuff должен иметь тип IO t, но это не так.

Приведенный выше код (скорее всего) был бы очень оскорбительным для хаскеллеров, но я надеюсь, что он передал, к чему именно я стремлюсь…

Как мне обойти это?

Комментарии:

1. Этот тип another_function был бы очень полезен. Или, по крайней мере, покажите его реализацию, если вы не уверены в типе. Это должно быть примерно [String] -> IO something так: судя по сообщению об ошибке, которое вы сделали, оно принимает IO параметр.

2. @delnan Ну, на самом деле я еще не написал another_function. Все, что я написал, было помещено в my_stuff , где my_stuff должен был быть строкой. Я хотел посмотреть, сможете ли вы выполнить «передачу параметров».

3. s <- getLine; putStrLn s должен работать просто отлично. Может быть, вы упускаете из виду что-то тонкое в своем резюме? Приводить небольшие изолированные примеры в целом здорово, но иногда в процессе теряется что-то жизненно важное…

4. @delnan Я думаю, что вы, возможно, неправильно поняли вопрос. Поэтому я решил немного прояснить это. Взгляните, если вы все еще заинтересованы в помощи 🙂

5. Ну, я хочу помочь. Но код, который вы опубликовали сейчас, все еще в порядке, игнорируя, что вы должны использовать show для преобразования nump обратно в строку for putStrLn , поскольку это an Int (и это не соответствует описанной вами ошибке). Я боюсь, что нам придется использовать большие пушки — пожалуйста, скопируйте и вставьте ваш точный код и то, как вы его компилируете / запускаете. См. ideone.com/kLMr7

Ответ №1:

Этот код работает. Это то, что вы хотите сделать? Если нет, можете ли вы предоставить код, который не работает?

 main = do
    putStrLn "Give me a number!"
    my_stuff <- getLine 
    let nump = read (my_stuff)::Int
    another_function nump

another_function nump = do
    putStrLn $ show nump
    putStrLn "Try again!"
    main
 

Комментарии:

1. На самом деле это не имеет отношения к исходному вопросу, но я бы, вероятно, переписал read (my_stuff)::Int , поскольку скобки на самом деле ничего не делают. Либо как (read my_stuff)::Int , либо просто read my_stuff :: Int .