- Философствахме над това как да си направим "чисто" IO и императивен синтаксис във функционален език.
- Имплементирахме си наше IO като нещо което променя
тип
World
- Направихме го да работи с
do
, като доказахме на хаскел, че е монада
-
putStr
-
putChar
как имплементираме
putStr
, рекурсивноputStr :: String -> IO () putStr [] = return () putStr (x:xs) = do putChar x putStr xs
-
print = putStrLn . show
-
when
вimport Control.Monad
import Control.Monad main = do c <- getChar when (c /= ' ') $ do putChar c main
-
sequence :: [IO a] -> IO [a]
- взима няколко действия, изпълнява ги и ни връща резултатите им.main = do a <- getLine b <- putStr "test" print [a,b] -- == main = do seq = sequence [getLine, putStr "test"] print seq
-
mapM
andmapM_
- sequence-ва колекция от монади до монада от колекцияmapM print [1,2,3] -- vs mapM_ print [1,2,3]
-
forever
- чейнва IO action със себе си forever -
forM = flip mapM
- дава ни готин синтаксис -
getContents
- чете от stdin докато не срещнеend-of-file
-
interact :: (String -> String) -> IO ()
- чете вход, дава хо на обработващата чиста ф-я и принт-ва резултата.
-
readFile :: FilePath -> IO String
- чете -
writeFile :: FilePath -> String -> IO ()
- пише
-
Reverse Polish notation calculator
-
Infix expression -
10 4 3 + 2 * -
-
Как работи?
Well, think of a stack. You go over the expression from left to right. Every time a number is encountered, push it on to the stack. When we encounter an operator, take the two numbers that are on top of the stack (we also say that we pop them), use the operator and those two and then push the resulting number back onto the stack. When you reach the end of the expression, you should be left with a single number if the expression was well-formed and that number represents the result.
-
Да прочетем Expression от файл
input
и да запишем резултата във файлoutput
.
Асоциативни списъци и графи (откраднати от тук - мс Еси)
-
Да дефинираме ф-я
mapValues mapper assocList
, която прилагаmapper
в/у всяка стойност наassocList
. -
Дефинирайте функция
extendWith assocList1 assocList2
, която връща асоциативен списък, съдържащ всички ключове наassocList1
иassocList2
. Ако някой ключ се повтаря, взема този отassocList2
-
Дефинирайте базовите функция
vertices graph
,children graph vertex
иhasEdge (u, v) graph
-
Дефинирайте функция
parents graph vertex
, която намира родителите на даден връх в граф -
Дефинирайте функция
invert graph
, която връща нова граф, получен отgraph
като "обърнем" всички ребра в него -
Дефинирайте функция
containsPath graph path
, която проверява дали пътятpath
се съдържа в подадения граф -
Дефинирайте функция
symmetric graph
, която проверява дали дадения граф е симетричен (ако съществува ребро от връхu
доv
, то същвстува и ребро отv
доu
)