Курсовая работа: Адресная книжка на Haskell
инструкция -> выражение ;
| образец <- выражение ;
| let список-объявлений ;
| ; (пустая инструкция)
Do-выражения предоставляют более удобный синтаксис для монадического программирования. Оно позволяет записать такое выражение
putStr "x: " >>
getLine >>= \l ->
return (words l)
в более традиционном виде:
doputStr "x: "
l <- getLine
return (words l)
Трансляция:
Для do-выражений выполняются следующие тождества, которые, после удаления пустых stmts, можно использовать в качестве трансляции в ядро:
do {e} =e
do {e;stmts} =e >> do {stmts}
do {p <- e; stmts} =let ok p = do {stmts}
ok _ = fail "..."
in e >>= ok
do {let decls; stmts} =let decls in do {stmts}
Пропуски "..." обозначают генерируемое компилятором сообщение об ошибке, передаваемое функции fail, желательно давая некоторое указание на местоположение ошибки сопоставления с образцом; функции >>, >>= и fail являются операциями в классе Monad, определенными в Prelude; ok является новым идентификатором.
Как показано в трансляции do, переменные, связанные let, имеют полностью полиморфные типы, тогда как те переменные, которые определены с помощью <-, являются связанными лямбда-выражением и поэтому являются мономорфными.
2.3 Монада ввода/вывода
2.3.1.Функции ввода
Эти функции считывают данные из стандартного устройства ввода (обычно это пользовательский терминал).
getChar :: IO Char
getLine :: IO String
getContents :: IO String
interact :: (String -> String) -> IO ()