#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
обратно в строку forputStrLn
, поскольку это anInt
(и это не соответствует описанной вами ошибке). Я боюсь, что нам придется использовать большие пушки — пожалуйста, скопируйте и вставьте ваш точный код и то, как вы его компилируете / запускаете. См. 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
.