Думаю, никто не ответил на этот очень важный вопрос:
Я хочу спросить str это строка или нет?
Я постараюсь.
Тип переменной str
равен String
, да.
Однако область действия этой переменной очень ограничена. Я думаю, что для понимания необходимо разобраться в нотации:
read' = readFile "/home/shk/workspace/src/test.txt" >>= (\str -> putStrLn str)
Я думаю, здесь становится более понятно, почему str
недостаточно хорош. Это аргумент функции, которую вы передаете >>=
. Его значение становится доступным только тогда, когда кто-то вызывает вашу функцию, что происходит только тогда, когда выполняется действие IO
, содержащее ее.
Кроме того, тип read' :: IO ()
определяется не столько putStrLn str
, сколько типом возврата оператора >>=
. Взгляните на это (специально для монады IO
):
(>>=) :: IO a -> (a -> IO b) -> IO b
Вы можете видеть, что результатом всегда является действие IO b
, поэтому попытка изменить любой из аргументов не поможет.
Вы можете прочитать учебник по монадам, если хотите понять, почему этот тип такой. За этим стоит интуиция: вы не можете выполнить действие без выполнения действия.
И с практической стороны вопроса использовать значение, возвращаемое некоторым действием, вместо попытки сделать use (extractValue inputAction)
, что не имеет смысла, потому что extractValue
невозможно, попробуйте inputAction >>= use
, если ваш use
включает ввод-вывод или fmap use inputAction
, если нет.