VasilM

haskell

Mar 12th, 2014
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haskell 12.13 KB | None | 0 0
  1. www.kernel.org
  2. apt-get install libncurses5-dev
  3. make menuconfig (/usr/src/linux...)
  4. sudo su (pass: student)
  5.  
  6. :::::::::::::::::::::::::::::::::::::::::::::::::::::
  7. LEKCIQ 1:
  8.  
  9. boykobb@gmail.com
  10.  
  11. f (g x)
  12. => h = f . g
  13. => за всяко подходящо x: h x = f (g x)
  14.  
  15. x + y
  16. => (+) x y
  17.  
  18. ((^2).(3*)) 5  => 5 * 3 = 15  =>  15 ^2 = 225
  19.  
  20. [[Int]] - spisyk ot spisyci ot celi chisla
  21. Float
  22. Double
  23. Char
  24.  
  25. argument -> rezultat
  26. pr: Int -> [Int]
  27.  
  28. map: prilaga deistvie F vyrhu vseki element ot spisyk S
  29. (a -> b ) -> ( [a] -> [b] )
  30.  
  31. pr: f = map (^2)
  32.     f [2,3,5] ___________ [4,9,25]
  33. (map (^2)) [2,3,5]
  34.  
  35. УПР:
  36. as = [4,1,0,3]
  37. a' = map (^2) as
  38. as'' = map (2^) as
  39. bs = "abcd"
  40. f x = [x,x]
  41. bs' = map f bs
  42.  
  43. http://www.math.bas.bg/bantchev/teaching/
  44. otvarqme test.hs -> tools -> go (f5)
  45. :R - komanda reload
  46.  
  47. :::::::::::::::::::::::::::::::::::::::::::::::::::::
  48. LEKCIQ 4
  49.  
  50.  
  51. ns = f 1
  52.  where f k = k : f (k+1)
  53.   <=> това горе е евивалентно на:
  54. ns = 1 : map (1+) ns
  55.  
  56.  
  57. !!! map (има 2 случая)
  58. 1сл. за празен списък
  59. 2сл. за непразен списък
  60.  
  61. пр:
  62. ns  = 1 : map (1+) ns
  63.     = 1 : map (1+) (1 : map (1+) ns)
  64.     = 1 : (1+) 1 : map (1+) (map (1+) ns)
  65.     = 1 : 2 : ...
  66.     = 1 : 2 : 3 : ...
  67.    
  68.    
  69. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  70. 1. ns = 1 : map (1+) ns
  71. _____________________________
  72. 2. map_[] = []
  73. 3. map f (x:xs) = fx : map f xs
  74. _____________________________
  75. 4. take 0 _= []
  76. 5. take _ []= []
  77. 6. take n (x:xs) = x:take(n-1)xs
  78.  
  79. legenda:
  80. "_" -  nezawisimo kakyw broj elementi
  81. "[]" - prazeb spisyk
  82. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  83.  
  84.            take 4 (map (^2) ns) =
  85. [ot 1.]  = take 4 (map (^2) (1: map (1+) ns)) =
  86. [ot 3.]  = take 4 ((^2) 1: map(^2)(map (1+) ns)) =
  87. [ot 6.]  = (^2) 1: take (4-1)(map(^2)(map (1+) ns)) =
  88. [ot 1.]  = 1: take 3 (map(^2) (map (1+) (1: map (1+) ns))) =
  89. ...      = 1: take 3 (map(^2) ((1+)1: map (1+) (map (1+) ns))) =
  90.          = 1: take 3 ((^2)((1+)1) : map (^2) (map (1+)(map (1+) ns))) =
  91.          = 1:(^2)((1+)1) : take (3-1)(map (^2) (map (1+)(map (1+) ns))) =
  92.          = 1: 4 : take 2(map (^2) (map (1+)(map (1+) (1: map (1+) ns)))) =
  93.          = 1: 4 : take 2(map (^2) (map (1+)((1+)1 : map(1+) (1: map (1+) ns)))) =
  94.          = 1: 4 : take 2(map (^2) ((1+)((1+)1) : map(1+) (map(1+) (1: map (1+) ns)))) =
  95.          = 1: 4 : take 2((^2) ((1+)((1+)1)) : map(^2) (map(1+) (map(1+) (1: map (1+) ns)))) =
  96.          = 1: 4 : (^2) ((1+)((1+)1)) : take (2-1) (map(^2) (map(1+) (map(1+) (1: map (1+) ns)))) =
  97.          = 1: 4 : 9 : take 1 (map(^2) (map(1+) ((1+)1 : map(1+)( map(1+) ns)))) =
  98.          = 1: 4 : 9 : take 1 (map(^2) (((1+)((1+)1)) : map (1+) (map(1+)( map(1+) ns)))) =
  99.          = 1: 4 : 9 : take 1 ((^2)((1+)((1+)1)) : map(^2)(map(1+)(map(1+)( map(1+) ns)))) =
  100.          = 1: 4 : 9 : (^2)((1+)((1+)1)) : take (1-1) ( map(^2)(map(1+)(map(1+)( map(1+) ns)))) =
  101. !!!! gubi se edna (1+) obyrkahme reshenieto 3-4 reda po-nagore
  102.          = 1: 4 : 9 : 16 : []
  103.          = [1, 4 ,9 , 16]
  104.  
  105. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  106. LEKCIQ 5
  107.  
  108. unique [] = []
  109. unique [x] = [x]
  110. unique (x1:x2:xs) = if (x1 == x2) then unique ( x2:xs ) else x1 : unique ( x2:xs )
  111.  
  112. :: lokalno opredelenie (WHERE/LET)
  113. 1) UNIQUE(X1:X2:XS) = IF (X1 == X2) THEN RS ELSE X1:RS
  114.      WHERE RS = UNIQUE (X2:XS)
  115.  
  116. 2) UNIQUE XS = XS
  117. ____________________________________________________________________________________
  118.  
  119. length - returns array length (function from huskell standard library)
  120.  
  121. len [] = 0
  122. len (x:xs) = 1 + len xs - edno plus dyljinata na ostatyka
  123.  
  124. len "abc" = 1 + len "bc" = 1 + ( 1 + len "c" ) =
  125. = 1 + ( 1 + ( 1 + len " " )) = 1 + ( 1 + ( 1 + 0 ) ) = 3
  126. ____________________________________________________________________________________
  127.  
  128. reverse - "abcde" -> "edcba" (HSL)
  129.  
  130. rev1 [] = []
  131. rev1 (x:xs) = rev1 xs ++ [x] // ++ dobavq spisyk ---> mnogo operacii n^2
  132. _________________________________________________________________
  133.  
  134. ("abcd", "") ->
  135. ('a':'b':'c':'d':[],[]) ->
  136. ('b':'c':'d':[],'a':[]) ->
  137. ('c':'d':[],'b':'a':[]) ->
  138. ('d':[],'c':'b':'a':[]) ->
  139. ([],'d':'c':'b':'a':[]) ->
  140.  
  141. rev2 xs = rv (xs,[])
  142.     where rv([],bs) = bs
  143.           rv(a:as,bs) = rv(as,a:bs)
  144. __________________________________________________________________
  145. x1,x2....xn-1, xn ->
  146. x1,xn,x2,xn-1,.....
  147.  
  148. shuttle [] = []
  149. shuttle (x:xs) = x: shuttle(reverse xs)
  150.  
  151.  
  152. :::::::::::::::::::::::::::::::::::::::::::::::::::::
  153. LEKCIQ 6
  154.  
  155. Функция за ляво групиране (foldr (right))
  156. fr _ u [] = u
  157. fr f u (x:xs) = f x (fr f u xs)
  158. _____________________________________________________
  159.  
  160. Функция за дясно групиране (foldl (left))
  161. fl _ u [] = u
  162. fl f u (x:xs) = fl f (f u x) xs
  163. _____________________________________________________
  164.  
  165. sum     = foldl (+) 0 = foldr (+) 0
  166.  
  167. product = foldl (*) 1 = foldr (*) 0
  168.  
  169. length xs = foldl f 0 xs
  170.     where f s _ = s+1
  171.    
  172. map f xs = foldr g [] xs
  173.     where g x rs = f x : rs
  174. ( fx1 : fx2 : ..... : fxn-1 : fxn : [] )
  175.  
  176. ____________________________________________________________
  177.  
  178. reverse xs = foldl f u xs               reverse xs = foldl f [] xs
  179.   where f rs x = x:rs        <=>        where f rs x = x:rs
  180.     u = []
  181.  
  182.  
  183. ::::::::::::::::::::::::::::::::::::::::::::::::::::::
  184. \a b -> a+b
  185. тази ф-я обаче не е особено полезна
  186. а тази е по-добра  \a b ->a+5*b това е функционален израз и може да се използва навсякъде
  187. запис от този вид, както и при функциите с ... за удобство заисваме
  188. \a -> (\b->...)
  189. \(p,q) -> ... казва ме, че елемента на функцията е двойка (p,q)
  190. ако вторият елемент не ни интересува може да напишем черта или конструктор т.е. \(p,_)-> или \(z:zs)->..
  191. length = foldl (\   )
  192. length = foldl(\n -> n+1)
  193. фунции от стандартната библиотека - take, drop, map, filter, length, reverse...
  194. foldl - имаме ф-я начална стойност и списък
  195. foldr
  196. да разбера какви са разликите м/у двете
  197. каъв е резултатът от прилагане на fold l  на отделен числов списък foldl (-) 0 xs
  198. и същият въпрос за foldr (-) 0 xs
  199. 0-x1, -x2, -x3,... -xn ...
  200. = 0-(x1+x2+x3..+xn)
  201. = сбора с отрицателен знак
  202. = - (x1 +x2+....+xn)
  203. вместо да пишем всичко това имаме фукнцията sum
  204. = - (sum xs)
  205. решение на вторят случай foldr (-) 0 xs
  206. x1-(x2-(x3..-(xn-1-(xn -0)..)..)..) =
  207. правим проверка за n =1; x1-0 = x1
  208. за n=2; x1-(x2-0) = x1-x2
  209. за n=3; x1-(x2-(x3-0)) = x1-x2+x3
  210. за n=4; x1-(x2-(x3-(x4-0)))= x1-x2+x3-x4
  211. извод: x1 винаги с полоителен знак, x2 винаги с отрицателен знак, тоест имаме редуване +, -, +, -, последниат знак се определя според четността
  212. задача: функция за изчисляване дължината на списък
  213. f xs = fold r (    ) - xs
  214. какво трябва на пишем в скобите ?
  215. лвият е поредниат елемент от списъка, а десния е натрупваната стойност
  216. f xs = foldr (\-n ->n+1) - xs
  217. за foldl (\n+1 -> -n) - xs , тоест разменят си местата
  218. задача: да напишем функция за ресмятане на полином
  219. 1. създаваме списък с полиномите [C0, C1, ....Cn] - колкото е броят на числата в списъка -1, получаваме степента на полинома
  220. кой е полинома [1,0,7] отг. x на втора степен +7
  221.  
  222. <<< 2. търсм по-удобна формула
  223. (..((c0.x+c1).x+c2).x+....+Cn-1) .x+Cn
  224. умножаваме с x и прибавяме следващиат елемент от списъка т.е. fldl , но н съвсем
  225. c0 e добре да го заменим с 0
  226. => (...(((0.x + c0).x+c1) . x+c2) .x+...+cn-1).x+cn
  227. вече сме готови да напишем функцията poly
  228. poly cs x = foldl ( коя е функцията в скобите  ) 0 cs
  229. poly cs x = foldl ( \ v c -> v.x+c ) 0 cs
  230.  
  231.  
  232. ::::::::::::::::::::::::::::::::::::::::::::::::::::::
  233.  
  234.  
  235. fs - spisyk [f1, f2, ....]
  236. x - stoinost
  237.  
  238. map_custom x fs = map ($x) fs           ....... f1 x, f2 x, ....
  239. map_custom x = map ($x)
  240.  
  241. ($x) = (flip ($)) x          flip f x y = f y x - smenq argumentite na funkciqta
  242. ((flip ($)) x) f = f x
  243.  
  244. => map ($x) = map  (flip ($) x)
  245.             = (map.flip ($)) x - kompozirana funkciq. 1wo deistw map, sledwana ot flip
  246.            
  247. =>  map_custom x = (map.flip($)) x
  248.     map_custom = map.flip($)  <=>   map_custom x fs = map ($x) fs
  249.    
  250.     ____________________________________________
  251.    
  252. f x y    <=>   x 'f' y
  253.  
  254. f'(x,y)
  255.  
  256. g y = f'(x,y)  | Neudobno re6enie
  257. h x = f'(x,y)  |
  258.  
  259. curry f x y = f (x,y)  - funkciq koqto razlaga dvoika, na 2 otdelni chlena
  260.  
  261. ex:  sbor(a,b) = a+b
  262.     curry sbor 5 12 = 17
  263.    
  264. uncurry g (x,y) = g x y  - obratnoto na curry
  265.  
  266.     _____________________________________________
  267.    
  268.     a1, a2, ...
  269.     b1, b2, ...
  270.     zipWith - deistwa wyrhu 2 spisyka
  271.    
  272. zipWith f as bs
  273. zipWith f as [] = []   <=>   zipWith _ _ [] = []
  274. zipWith f [] bs = []         zipWith _ [] _ = []
  275. zipWith f (a.as) (b.bs)  = f a b : zipWith as bs    - pone edin element
  276.  
  277. ex: zipWith (+) (1,2,3)(1,2,3)  = (2,4,6)
  278.  
  279.     (,) - operaciq za obrazwane na dwoika (a,b)
  280.    
  281. zip as bs = zipWith (,) as bs   <=>     zip = zipWith (,) - bezargumenten stil
  282.  
  283. zip3, zip4, ... zip7 - deistwat wyrhu powe4e ot 2 spisyka ... 3, 4, 5... 7 
  284. zipWith3, zipWith4, .... zipWith7
  285. import Data.List     - za da vklu4im dopylnitelent modul
  286.  
  287. unzip - razdelq spisyl ot dvoiki na dvoika ot spisyci
  288. unzip [] = ([],[])
  289. upzip (x,y):xys = (x:xs, y:ys)
  290.     where (xs,ys) = unzip xys
  291.  
  292.     _____________________________________________
  293. fibs      = 0 1 1 2 3 5 8 12 21 34 55 .... redicata na fibonchi
  294. tail fibs = 1 1 2 3 5 8 12 21 34 55 89 ....
  295.  
  296. fibs = 0:1:zipWith(+) fibs (tail fibs)
  297.  
  298. head - pyrwiq element
  299. head (x:xs) = x
  300.  
  301. tail - wsi4ki elementi bez 1viq
  302. tail (x:xs) = xs
  303.  
  304. last - posledniq element
  305. last [x] = x    
  306. last (x:x1:xs) = last (x1:xs)
  307.  
  308. init - dawa vsi4ki elementi bez posledniq
  309.  
  310.  
  311.  
  312.  
  313. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  314.  
  315.  
  316.  
  317. type име на променлива [параметри] = израз описващ тип
  318.  
  319. пр:
  320. type N = Int
  321. type Coord = (Int,Int)
  322. type Coord a = (a,a)
  323. => Coord Int - slojno ime na tipa
  324. type Pair a b = (a,b)
  325. type Table a b = [(a,b)]
  326. type Graph a = [(a,[a])] <или> Table a [a]
  327.  
  328. _____________________________________________________
  329.  
  330. data име на тип [параметри] = Конструктор 1 | Констр. 2 | .....
  331.  
  332. пр:
  333. data List a = Elist | Clist a (List a)
  334.                 аналогичен на:     
  335.                 []          :
  336. List Int
  337. List (a->a)
  338. Clist 'z' ( Clist ';' Elist )   -  списък от 2 елемента: 'z':';':[]  <или> ['z',';'] <или>  "z;"
  339.  
  340. listlen Elist = 0
  341. listlen (Clist _ xs) = 1 + listlen xs
  342.  
  343. _______________________________________________________
  344.  
  345. Тип за представяне на двоично дърво:
  346.  
  347. data BinaryTree a = EmptyTree | CTree a (BinaryTree a) (BinaryTree a)
  348. -> EmptyTree
  349. -> CTree "abz" EmptyTree EmptyTree
  350.  
  351. Функция за обхождане Ляв - Корен - Десен:
  352.  
  353. BTreeWalk :: BinaryTree a -> [a]
  354. BTreeWalk EmptyTree = []
  355. BTreeWalk (Ctree x leftT rightT) = BTreeWalk leftT ++ [x] ++ BTreeWalk rightT
  356.  
  357. функция за построяване на двоично подреждащо дърво:
  358. Ord - семейстовто (класа) на подредимите типове в хаскел
  359.  
  360. ListToBSTree :: Ord a => [a] -> BTree a
  361. InsBSTree :: Ord a => а -> BTree a -> BTree a
  362. InsBSTree x EmptyTree = CTree x EmptyTree EmptyTree
  363. InsBSTree x (CTree y leftT rightT) =
  364.     | x <= y | = CTree y (InsBSTree x leftT) rightT
  365.     | x > y | = CTree y leftT (InsBSTree x rightT)
  366.    
  367. => ListToBSTree = foldr InsBSTree EmptyTree
  368.  
  369. BSTreeSort = BinaryTreeWalk.ListToBSTree
Advertisement
Add Comment
Please, Sign In to add comment