Есть ли способ получить IO вне основного в Haskell? - PullRequest
0 голосов
/ 15 октября 2019

Это может быть глупый вопрос, но я получаю ошибку, когда пытаюсь получить ввод вне функции main:

menu2Players :: String -> String -> (String, String)
menu2Players player1 player2 = do
    putStrLn("Qual o nome do primeiro jogador?\n")
    player1 <- getLine
    putStrLn("Qual o nome do segundo jogador?\n")
    player2 <- getLine
    return (player1, player2)

Ошибка, которую я получил

Операция ввода-вывода 'main' не определена в модуле 'Main'

Что я могу сделать, чтобы это исправить?

Ответы [ 2 ]

1 голос
/ 15 октября 2019

В Haskell, если вы хотите выполнить IO в функции, она должна вернуть IO.

menu2Players :: String -> String -> IO (String, String)
menu2Players player1 player2 = do
    putStrLn "Qual o nome do primeiro jogador?\n"
    player1 <- getLine
    putStrLn "Qual o nome do segundo jogador?\n"
    player2 <- getLine
    return (player1, player2)

Детали того, почему вам нужно возвращать IO, немного сложны, ноВы можете узнать об этом здесь: http://learnyouahaskell.com/input-and-output

0 голосов
/ 22 октября 2019

(немного поздно, но ...) Код, который сработал, мне просто нужен возврат IO.

menu2Players = do
    putStrLn "Qual o nome do primeiro jogador?\n"
    player1 <- getLine
    putStrLn "Qual o nome do segundo jogador?\n"
    player2 <- getLine
    return (player1, player2)
...