rapture 20.07.2011 05:55 unknown

main = do
inpStr ← readFile "input.txt"
writeFile "output.txt" (map toUpper inpStr)
Интуитивно понимаю, что здесь где-то получается преобразование IO String → String. Потому что
ghci> :t readFile
readFile :: FilePath → ___IO String___
ghci> :t writeFile
writeFile :: FilePath → ___String____ → IO ()
ну и writeFile "output.txt" (readFile "input.txt") какбэ намекае.
Проблема в том, что, собственно, IO String → String не превращается, потому что применение map lines (readFile) заканчивается предсказуемо (lines-то ждет String, а не подсовываемых по одному Char).
Решение лежит на http://stackoverflow.com/questions/16753... , но я до него не додумался пока. Как-то все немного странно: разобрать IO String на Char можно, а на String только каким-то извратом. Попытка обхода через вызов lines map тоже заканчивается ошибкой типов.

1. Minoru 20.07.2011 06:25 netbook

IO чототам — это действие (action). Чтобы получить результат (который будет иметь тип «чототам»), действие нужно выполнить, а результату дать имя: name ← readFile "filename". Теперь name имеет тип String и хранит содержимое файла.
Вот здесь можешь про ввод-вывод в Haskell почитать, например: http://book.realworldhaskell.org/read/io...

Do you really want to delete ?