Запись строки ввода-вывода на стандартный вывод в Haskell - PullRequest
11 голосов
/ 20 декабря 2011

Как мы печатаем выходные данные функции, которая возвращает строку ввода-вывода в стандартный вывод?Я не могу использовать шоу или распечатать.

Ответы [ 2 ]

18 голосов
/ 20 декабря 2011

Если вы хотите напечатать результат функции foo :: Int -> IO String (например), вы можете сделать

main = do
    str <- foo 12
    putStrLn str

или, без записи,

main = foo 12 >>= putStrLn.

До-нотация является синтаксическим сахаром для второго, который использует фундаментальный комбинатор (>>=), который имеет тип

(>>=) :: Monad m => m a -> (a -> m b) -> m b

IO является экземпляром класса Monad, поэтому вы можете использовать его здесь.

foo :: Int -> IO String
foo 12 :: IO String

putStrLn :: String -> IO ()

(foo 12) >>= putStrLn :: IO ()
6 голосов
/ 21 декабря 2011

Как распечатать вывод функции, которая возвращает строку ввода-вывода в стандартный вывод?

Хорошо, давайте посмотрим.Вот функция, которая возвращает строку ввода-вывода:

dumbFunction :: a -> IO String
dumbFunction x = getLine

dumbFunction - глупая функция (но, тем не менее, функция!).Он игнорирует свой ввод, а затем возвращает getLine, который имеет тип IO String.

Итак, вы скажете мне, как вы печатаете getLine :: IO String?Ответ - нет!Это то, что мы называем «IO action».Обратите внимание, что действие ввода-вывода - это , а не функция, потому что оно не принимает ввод.(Однако действия ввода-вывода могут получать ввод от операций ввода-вывода, таких как чтение стандартного ввода, как это делает getLine. Но это не считается «функцией», поскольку она не принимает никаких традиционных входных данных)

Итаквместо того, чтобы распечатывать само действие, вы, вероятно, захотите запустить действие, а затем распечатать результат.Это можно сделать, как описано Даниэлем Фишером (с помощью <-, который можно рассматривать как оператор «выполнения»).

...