Advertisement
Guest User

26 04 fpr

a guest
Apr 26th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haskell 23.78 KB | None | 0 0
  1. import Prelude hiding ((.))
  2. {-
  3. Ламбда изрази, частично прилагане на функции, композиция, оператор ($)
  4.  
  5. I. Ламбда изрази: в Haskell всички ф-и са ламбда изрази.
  6.    
  7. В Haskell ламбда изразите изглеждат така:
  8.  
  9.     foo :: Int -> Int
  10.     foo = \x -> 2 * x
  11.  
  12. което е АБСОЛЮТНО съшото като:
  13.  
  14.     foo :: Int -> Int
  15.     foo x = 2 * x
  16.  
  17. Още примери (Групираните по-долу дефиниции са еквивалиентни)
  18.  
  19.     bar :: Int -> Int -> Int
  20.     bar = \x -> \y -> x + y
  21.     bar = \x y -> x + y
  22.     bar x y = x + y
  23.  
  24.     baz :: Int -> Int -> Int -> Int
  25.     baz =   \x ->  \y ->  \z -> x + y * z
  26.     baz = \x y z -> x + y * z
  27.     baz = \x -> \y -> \z -> x + y * z
  28.  
  29. II. Частично прилагане на функции
  30.  
  31.     Частично прилагане на функции означава да подадем по-малък брой аргументи от броя на параметри
  32.     на функцията и да получим нова функция на останалия брой параметри.
  33.  
  34.     mult :: Integer -> Integer -> Integer
  35.     mult x y = x * y
  36.     mult 5   ->   резултата е функция от вида (mult 5) :: Integer -> Integer, т.е. единия параметър
  37.                   вече е фиксиран
  38.  
  39.     За какво може да ни послужи това?
  40.     Ако искаме да умножим всички числа в един списък по числото две, не е нужно да правим нов ламбда израз:
  41.     map (\x -> x ^ 2) [1, 2, 3]   ->   [1, 4, 6]
  42.     map (mult 2) [1, 2, 3]        ->   [1, 4, 6]
  43.    
  44.     Имаме функцията:
  45.     pow :: Integer -> Integer -> Integer
  46.     pow x y = x ^ y
  47.  
  48.     Искаме да повдигнем всички елементи в списък на квадрат. Ще сработи ли следният код?
  49.     map (pow 2) [1, 2, 3]   ->   [1, 4, 8]
  50.  
  51.     В този случай няма да получим [1, 4, 9], както искаме, а ще получим [1, 4, 8], тъй като
  52.     от дефиницията на pow повдигаме първия параметър на степен втория параметър.
  53.     Затова Haskell ни предоставя следният синтаксис който важи само за функции от 2 параметъра с инфиксен запис.
  54.  
  55.     map (`pow` 2) [1, 2, 3]   ->   [1, 4, 9]
  56.  
  57.     По този начин можем да прилагаме аргументи отляво и отдясно на функцията. Ето малко други примери:
  58.  
  59.     map (2^) [1, 2, 3]   ->   [1, 4, 8]
  60.     map (^2) [1, 2, 3]   ->   [1, 4, 9]
  61.     map (+1) [1, 2, 3]   ->   [2, 3, 4]
  62.     map (1+) [1, 2, 3]   ->   [2, 3, 4]
  63.  
  64.     Ето още един интересен случай:
  65.     map (`elem` [1, 2, 3]) [2, 5, 3]  ->  [True, False, True]
  66.  
  67.  
  68. III. Композиция на функции и оператор ($)
  69.  
  70.     1. Композиция на функции.
  71.     Дефниция: Ако имаме две функции f и g, то тяхна композиция наричаме фунцкията (f . g)(x) = f(g(x)).
  72.               "(f . g)" се произнася f след g.
  73.     В Haskell, както видяхте, за композиране се използва операторът (.) :: (b -> c) -> (a -> b) -> (a -> c)
  74.  
  75. Примери:
  76.     f = (^2)
  77.     g = (\x -> x * 2)
  78.  
  79.     (f . g) 2 -> (f . g)(2) -> f(g(2)) -> f(2*2) -> f(4) -> 4^2 -> 16
  80.     Забележете, че изразът (f . g) връща функция, след което върху тази получена функция прилагаме аргумента 2.
  81.  
  82.     2. Оператор ($)
  83.     Инфикцият оператор ($) се използва за премахване на скоби от кода. Той оценява напълно израза отдясно преди
  84.     да го подаде на функцията отляво.
  85.  
  86. Примери:
  87.  
  88.     abs (3 - 12) -> 9
  89.     abs $ 3 - 12 -> 9
  90.  
  91. Примери за използване на двата оператора заедно:
  92.     f = (-5)
  93.     g = (*2)
  94.     h = (+8)
  95.  
  96.     (f (g (h (4 + 1))))    -> f (g (h 5)) -> f (g (5 + 8)) -> f (13 * 2) -> (26 - 5) -> 21
  97.     f . g . h $ 4 + 1      -> f (g (h 5)) -> f (g (5 + 8)) -> f (13 * 2) -> (26 - 5) -> 21
  98. -}
  99.  
  100. {-
  101. Задача 1. Дефинирайте инфиксния оператор (.) за композиция на функции. (Премахнат е от Prelude,
  102. за да можем да си го дефинираме сами).
  103.  
  104. Пример:
  105.     (^2) . (+1) $ 5   -> (5+1)^2 -> 36
  106.     (+1) . (+1) $ 2   -> 4
  107.     Извикваме оператора (.) върху две едноаргументни функции и получаваме като РЕЗУЛТАТ ТРЕТА ФУНКЦИЯ
  108.     която е тяхната композиция. Върху този резултат от f . g, който е ФУНКЦИЯ, прилагаме
  109.     някакъв аргумент x за да получим стойността на композицията в тази стойност на x.
  110. -}
  111. (.) :: (b -> c) -> (a -> b) -> (a -> c)
  112. f . g = \x -> f $ g x
  113.  
  114.  
  115. {-
  116. Задача 2. Дефинирайте следните функции от по-висок ред:
  117. а). fmin f g, която приема две едноместни числови функции f и gh
  118. и връща едноместни числова функция, чиято стойност в точка x е
  119. минимума на f и g.
  120. б). fmax f g, като fmin, но връща максимума на f и g.
  121. в). favg f g, като fmin, но връща средното аритметично на f и g.
  122.  
  123. f = (**2)
  124. f = (\x -> x ** 2)
  125. f x = x ** 2
  126.  
  127. g = (2**)
  128. g = (\x -> 2 ** x)
  129. g x = 2 ** x
  130.  
  131. Примери:
  132.     Тук долара може да се изпусне но е важно да се запомни, че резултата
  133.     на fmin f g е функция върху която прилагаме "3-тия" аргумент.
  134.     (fmin f g) 3    -> 8
  135.     fmin f g $ 5    -> 25
  136.     fmax f g $ 3    -> 9
  137.     fmax f g 5      -> 32
  138.     favg f g 3      -> 8.5
  139.     favg f g 5      -> (25 + 32) / 2 -> 28.5
  140. -}
  141. fmin :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  142. fmin f g = \x -> min (f x) (g x)
  143.  
  144. fmax :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  145. fmax f g = \x -> max (f x) (g x)
  146.  
  147. favg :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  148. favg f g = \x -> (f x + g x)/2
  149.  
  150.  
  151. {-
  152. Задача 3. Дефинирайте следните функции от по-висок ред:
  153. а). boundUp f up, която приема едноместни числова функция f и
  154. и числова стойност up и връща едноместни числова функция, чиято
  155. стойност в точка x е минимума на f(x) и up.
  156. б). boundDown f down, същата като boundUp, но връща максимума
  157. на f(x) и down.
  158.  
  159. Примери:
  160.     f = \x -> x + 1
  161.  
  162.     boundUp f 5 $ 1              -> 2
  163.     boundUp f 5 $ 1              -> 2
  164.     boundUp (\x -> x + 1) 5 $ 5  -> 5
  165.     boundUp (^3) 25 $ 2          -> 8
  166.     boundUp (^3) 15 $ 3          -> 15
  167.  
  168.     boundDown (^2) 5 $ 1         -> 5
  169.     boundDown (^2) 5 $ 3         -> 9
  170. -}
  171. boundUp :: (Double -> Double) -> Double -> (Double -> Double)
  172. boundUp f up = \x -> min (f x) up
  173.  
  174. boundDown :: (Double -> Double) -> Double -> (Double -> Double)
  175. boundDown f down = \x -> max (f x) down
  176.  
  177.  
  178. {-
  179. Задача 4. Производна на функция: Напишете функцията derivative f dx, която приема едноместна
  180. числова функция f и стъпка dx и връща функция, чиято стойност в дадена точка x, е приближението
  181. на производната на f в x.
  182.  
  183. Примери:
  184.     f' = (\x -> x ^ 3 / 3) `derivative` 1e-6
  185.  
  186.     f' 0 = 3.333333333333333e-13
  187.     f' 1 = 1.000000000001
  188.     f' 2 = 4.000000000115023
  189.     f' 10 = 99.99999994647624
  190. -}
  191. derivative :: (Double -> Double) -> Double -> (Double -> Double)
  192. derivative f dx = \x -> ( f (x+dx) - f x )/dx
  193.  
  194.  
  195. {-
  196. Задача 5. Напишете функцията maximize, която получава непразен списък от едноместни
  197. числови функции и връща нова едноместна числова функция на аргумент x, която дава
  198. стойността f x на тази фунция f от списъка, за която числото f x е най-голямо
  199. по абсолютна стойност.
  200.  
  201. Пример:
  202.     maximize [(\x -> x ** 3), (\x -> x + 1)] 0.5  = 1.5
  203.     maximize [(\x -> x ** 3), (\x -> x + 1), (\x -> x ** 4)] (-2) = 16
  204. -}
  205. maximize :: [Double -> Double] -> (Double -> Double)
  206. maximize fs = undefined
  207.  
  208.  
  209. {-
  210. Задача 6. Напишете функцията compose fs, която приема списък от едноаргументни функцуии
  211. и връща тяхната композиция, т.е. compose [f1, f2, .. fn] x = f1(f2( ... (fn(x))))
  212.  
  213. Пример:
  214.     compose [(+1), (2*)] 7 = (2 * 7) + 1 = 15
  215.     compose [(+1), (+1), (+1)] 7 = 10
  216. -}
  217. compose :: [(a -> a)] -> (a -> a)
  218. compose fs = undefined
  219.  
  220.  
  221. {-
  222. Задача 7. Дефинирайте функцията closestPoint xys), която приема
  223. списък от точки в равнината (представени чрез двойки (x . y)) и връща
  224. едноаргументна функция, чиято стойност в дадена точка p e най-близката
  225. до p точка от xys.
  226.  
  227. Примери:
  228.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (3, 3)    -> (0, 0)
  229.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (6, 6)    -> (10, 10)
  230.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (10, 1)   -> (10, 0)
  231.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (1, 10)   -> (0, 10)
  232.  
  233. -}
  234. type Point2D = (Double, Double)
  235.  
  236. closestPoint :: [Point2D] -> (Point2D -> Point2D)
  237. closestPoint xys = undefined
  238.  
  239.  
  240. -- ТЕСТОВЕ НА ЗАДАЧИТЕ --
  241. main = do
  242.     {-
  243.     print "Exercise 1."
  244.     print $ (^2) . (+1) $ 5
  245.     print $ (+1) . (+1) $ 2
  246.    
  247.     print "Exercise 2."
  248.     print $ (fmin (**2) (2**)) 3
  249.     print $ fmin (**2) (2**) $ 5
  250.     print $ fmax (**2) (2**) $ 3
  251.     print $ fmax (**2) (2**) 5  
  252.     print $ favg (**2) (2**) 3  
  253.     print $ favg (**2) (2**) 5  
  254.    
  255.     print "Exercise 3."
  256.     print $ boundUp (+1) 5 $ 1
  257.     print $ boundUp (+1) 5 $ 1
  258.     print $ boundUp (+1) 5 $ 5
  259.     print $ boundUp (^3) 25 $ 2
  260.     print $ boundUp (^3) 15 $ 3
  261.     print $ boundDown (^2) 5 $ 1
  262.     print $ boundDown (^2) 5 $ 3
  263.     -}
  264.     print "Exercise 4."
  265.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 0
  266.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 1
  267.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 2
  268.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 10
  269.     {-
  270.     print "Exercise 5."
  271.     print $ maximize [(\x -> x ** 3), (\x -> x + 1)] 0.5
  272.     print $ maximize [(\x -> x ** 3), (\x -> x + 1), (\x -> x ** 4)] (-2)
  273.  
  274.     print "Exercise 6."
  275.     print $ compose [(+1), (2*)] 7
  276.     print $ compose [(+1), (+1), (+1)] 7
  277.  
  278.     print "Exercise 7."
  279.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (3, 3)
  280.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (6, 6)
  281.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (10, 1)
  282.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (1, 10)
  283.     -}
  284. import Prelude hiding ((.))
  285. {-
  286. Ламбда изрази, частично прилагане на функции, композиция, оператор ($)
  287.  
  288. I. Ламбда изрази: в Haskell всички ф-и са ламбда изрази.
  289.    
  290. В Haskell ламбда изразите изглеждат така:
  291.  
  292.     foo :: Int -> Int
  293.     foo = \x -> 2 * x
  294.  
  295. което е АБСОЛЮТНО съшото като:
  296.  
  297.     foo :: Int -> Int
  298.     foo x = 2 * x
  299.  
  300. Още примери (Групираните по-долу дефиниции са еквивалиентни)
  301.  
  302.     bar :: Int -> Int -> Int
  303.     bar = \x -> \y -> x + y
  304.     bar = \x y -> x + y
  305.     bar x y = x + y
  306.  
  307.     baz :: Int -> Int -> Int -> Int
  308.     baz =   \x ->  \y ->  \z -> x + y * z
  309.     baz = \x y z -> x + y * z
  310.     baz = \x -> \y -> \z -> x + y * z
  311.  
  312. II. Частично прилагане на функции
  313.  
  314.     Частично прилагане на функции означава да подадем по-малък брой аргументи от броя на параметри
  315.     на функцията и да получим нова функция на останалия брой параметри.
  316.  
  317.     mult :: Integer -> Integer -> Integer
  318.     mult x y = x * y
  319.     mult 5   ->   резултата е функция от вида (mult 5) :: Integer -> Integer, т.е. единия параметър
  320.                   вече е фиксиран
  321.  
  322.     За какво може да ни послужи това?
  323.     Ако искаме да умножим всички числа в един списък по числото две, не е нужно да правим нов ламбда израз:
  324.     map (\x -> x ^ 2) [1, 2, 3]   ->   [1, 4, 6]
  325.     map (mult 2) [1, 2, 3]        ->   [1, 4, 6]
  326.    
  327.     Имаме функцията:
  328.     pow :: Integer -> Integer -> Integer
  329.     pow x y = x ^ y
  330.  
  331.     Искаме да повдигнем всички елементи в списък на квадрат. Ще сработи ли следният код?
  332.     map (pow 2) [1, 2, 3]   ->   [1, 4, 8]
  333.  
  334.     В този случай няма да получим [1, 4, 9], както искаме, а ще получим [1, 4, 8], тъй като
  335.     от дефиницията на pow повдигаме първия параметър на степен втория параметър.
  336.     Затова Haskell ни предоставя следният синтаксис който важи само за функции от 2 параметъра с инфиксен запис.
  337.  
  338.     map (`pow` 2) [1, 2, 3]   ->   [1, 4, 9]
  339.  
  340.     По този начин можем да прилагаме аргументи отляво и отдясно на функцията. Ето малко други примери:
  341.  
  342.     map (2^) [1, 2, 3]   ->   [1, 4, 8]
  343.     map (^2) [1, 2, 3]   ->   [1, 4, 9]
  344.     map (+1) [1, 2, 3]   ->   [2, 3, 4]
  345.     map (1+) [1, 2, 3]   ->   [2, 3, 4]
  346.  
  347.     Ето още един интересен случай:
  348.     map (`elem` [1, 2, 3]) [2, 5, 3]  ->  [True, False, True]
  349.  
  350.  
  351. III. Композиция на функции и оператор ($)
  352.  
  353.     1. Композиция на функции.
  354.     Дефниция: Ако имаме две функции f и g, то тяхна композиция наричаме фунцкията (f . g)(x) = f(g(x)).
  355.               "(f . g)" се произнася f след g.
  356.     В Haskell, както видяхте, за композиране се използва операторът (.) :: (b -> c) -> (a -> b) -> (a -> c)
  357.  
  358. Примери:
  359.     f = (^2)
  360.     g = (\x -> x * 2)
  361.  
  362.     (f . g) 2 -> (f . g)(2) -> f(g(2)) -> f(2*2) -> f(4) -> 4^2 -> 16
  363.     Забележете, че изразът (f . g) връща функция, след което върху тази получена функция прилагаме аргумента 2.
  364.  
  365.     2. Оператор ($)
  366.     Инфикцият оператор ($) се използва за премахване на скоби от кода. Той оценява напълно израза отдясно преди
  367.     да го подаде на функцията отляво.
  368.  
  369. Примери:
  370.  
  371.     abs (3 - 12) -> 9
  372.     abs $ 3 - 12 -> 9
  373.  
  374. Примери за използване на двата оператора заедно:
  375.     f = (-5)
  376.     g = (*2)
  377.     h = (+8)
  378.  
  379.     (f (g (h (4 + 1))))    -> f (g (h 5)) -> f (g (5 + 8)) -> f (13 * 2) -> (26 - 5) -> 21
  380.     f . g . h $ 4 + 1      -> f (g (h 5)) -> f (g (5 + 8)) -> f (13 * 2) -> (26 - 5) -> 21
  381. -}
  382.  
  383. {-
  384. Задача 1. Дефинирайте инфиксния оператор (.) за композиция на функции. (Премахнат е от Prelude,
  385. за да можем да си го дефинираме сами).
  386.  
  387. Пример:
  388.     (^2) . (+1) $ 5   -> (5+1)^2 -> 36
  389.     (+1) . (+1) $ 2   -> 4
  390.     Извикваме оператора (.) върху две едноаргументни функции и получаваме като РЕЗУЛТАТ ТРЕТА ФУНКЦИЯ
  391.     която е тяхната композиция. Върху този резултат от f . g, който е ФУНКЦИЯ, прилагаме
  392.     някакъв аргумент x за да получим стойността на композицията в тази стойност на x.
  393. -}
  394. (.) :: (b -> c) -> (a -> b) -> (a -> c)
  395. f . g = \x -> f $ g x
  396.  
  397.  
  398. {-
  399. Задача 2. Дефинирайте следните функции от по-висок ред:
  400. а). fmin f g, която приема две едноместни числови функции f и gh
  401. и връща едноместни числова функция, чиято стойност в точка x е
  402. минимума на f и g.
  403. б). fmax f g, като fmin, но връща максимума на f и g.
  404. в). favg f g, като fmin, но връща средното аритметично на f и g.
  405.  
  406. f = (**2)
  407. f = (\x -> x ** 2)
  408. f x = x ** 2
  409.  
  410. g = (2**)
  411. g = (\x -> 2 ** x)
  412. g x = 2 ** x
  413.  
  414. Примери:
  415.     Тук долара може да се изпусне но е важно да се запомни, че резултата
  416.     на fmin f g е функция върху която прилагаме "3-тия" аргумент.
  417.     (fmin f g) 3    -> 8
  418.     fmin f g $ 5    -> 25
  419.     fmax f g $ 3    -> 9
  420.     fmax f g 5      -> 32
  421.     favg f g 3      -> 8.5
  422.     favg f g 5      -> (25 + 32) / 2 -> 28.5
  423. -}
  424. fmin :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  425. fmin f g = \x -> min (f x) (g x)
  426.  
  427. fmax :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  428. fmax f g = \x -> max (f x) (g x)
  429.  
  430. favg :: (Double -> Double) -> (Double -> Double) -> (Double -> Double)
  431. favg f g = \x -> (f x + g x)/2
  432.  
  433.  
  434. {-
  435. Задача 3. Дефинирайте следните функции от по-висок ред:
  436. а). boundUp f up, която приема едноместни числова функция f и
  437. и числова стойност up и връща едноместни числова функция, чиято
  438. стойност в точка x е минимума на f(x) и up.
  439. б). boundDown f down, същата като boundUp, но връща максимума
  440. на f(x) и down.
  441.  
  442. Примери:
  443.     f = \x -> x + 1
  444.  
  445.     boundUp f 5 $ 1              -> 2
  446.     boundUp f 5 $ 1              -> 2
  447.     boundUp (\x -> x + 1) 5 $ 5  -> 5
  448.     boundUp (^3) 25 $ 2          -> 8
  449.     boundUp (^3) 15 $ 3          -> 15
  450.  
  451.     boundDown (^2) 5 $ 1         -> 5
  452.     boundDown (^2) 5 $ 3         -> 9
  453. -}
  454. boundUp :: (Double -> Double) -> Double -> (Double -> Double)
  455. boundUp f up = \x -> min (f x) up
  456.  
  457. boundDown :: (Double -> Double) -> Double -> (Double -> Double)
  458. boundDown f down = \x -> max (f x) down
  459.  
  460.  
  461. {-
  462. Задача 4. Производна на функция: Напишете функцията derivative f dx, която приема едноместна
  463. числова функция f и стъпка dx и връща функция, чиято стойност в дадена точка x, е приближението
  464. на производната на f в x.
  465.  
  466. Примери:
  467.     f' = (\x -> x ^ 3 / 3) `derivative` 1e-6
  468.  
  469.     f' 0 = 3.333333333333333e-13
  470.     f' 1 = 1.000000000001
  471.     f' 2 = 4.000000000115023
  472.     f' 10 = 99.99999994647624
  473. -}
  474. derivative :: (Double -> Double) -> Double -> (Double -> Double)
  475. derivative f dx = \x -> ( f (x+dx) - f x )/dx
  476.  
  477.  
  478. {-
  479. Задача 5. Напишете функцията maximize, която получава непразен списък от едноместни
  480. числови функции и връща нова едноместна числова функция на аргумент x, която дава
  481. стойността f x на тази фунция f от списъка, за която числото f x е най-голямо
  482. по абсолютна стойност.
  483.  
  484. Пример:
  485.     maximize [(\x -> x ** 3), (\x -> x + 1)] 0.5  = 1.5
  486.     maximize [(\x -> x ** 3), (\x -> x + 1), (\x -> x ** 4)] (-2) = 16
  487. -}
  488. maximize :: [Double -> Double] -> (Double -> Double)
  489. maximize fs = undefined
  490.  
  491.  
  492. {-
  493. Задача 6. Напишете функцията compose fs, която приема списък от едноаргументни функцуии
  494. и връща тяхната композиция, т.е. compose [f1, f2, .. fn] x = f1(f2( ... (fn(x))))
  495.  
  496. Пример:
  497.     compose [(+1), (2*)] 7 = (2 * 7) + 1 = 15
  498.     compose [(+1), (+1), (+1)] 7 = 10
  499. -}
  500. compose :: [(a -> a)] -> (a -> a)
  501. compose fs = undefined
  502.  
  503.  
  504. {-
  505. Задача 7. Дефинирайте функцията closestPoint xys), която приема
  506. списък от точки в равнината (представени чрез двойки (x . y)) и връща
  507. едноаргументна функция, чиято стойност в дадена точка p e най-близката
  508. до p точка от xys.
  509.  
  510. Примери:
  511.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (3, 3)    -> (0, 0)
  512.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (6, 6)    -> (10, 10)
  513.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (10, 1)   -> (10, 0)
  514.     closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (1, 10)   -> (0, 10)
  515.  
  516. -}
  517. type Point2D = (Double, Double)
  518.  
  519. closestPoint :: [Point2D] -> (Point2D -> Point2D)
  520. closestPoint xys = undefined
  521.  
  522.  
  523. -- ТЕСТОВЕ НА ЗАДАЧИТЕ --
  524. main = do
  525.     {-
  526.     print "Exercise 1."
  527.     print $ (^2) . (+1) $ 5
  528.     print $ (+1) . (+1) $ 2
  529.    
  530.     print "Exercise 2."
  531.     print $ (fmin (**2) (2**)) 3
  532.     print $ fmin (**2) (2**) $ 5
  533.     print $ fmax (**2) (2**) $ 3
  534.     print $ fmax (**2) (2**) 5  
  535.     print $ favg (**2) (2**) 3  
  536.     print $ favg (**2) (2**) 5  
  537.    
  538.     print "Exercise 3."
  539.     print $ boundUp (+1) 5 $ 1
  540.     print $ boundUp (+1) 5 $ 1
  541.     print $ boundUp (+1) 5 $ 5
  542.     print $ boundUp (^3) 25 $ 2
  543.     print $ boundUp (^3) 15 $ 3
  544.     print $ boundDown (^2) 5 $ 1
  545.     print $ boundDown (^2) 5 $ 3
  546.     -}
  547.     print "Exercise 4."
  548.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 0
  549.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 1
  550.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 2
  551.     print $ (\x -> x ^ 3 / 3) `derivative` 1e-6 $ 10
  552.     {-
  553.     print "Exercise 5."
  554.     print $ maximize [(\x -> x ** 3), (\x -> x + 1)] 0.5
  555.     print $ maximize [(\x -> x ** 3), (\x -> x + 1), (\x -> x ** 4)] (-2)
  556.  
  557.     print "Exercise 6."
  558.     print $ compose [(+1), (2*)] 7
  559.     print $ compose [(+1), (+1), (+1)] 7
  560.  
  561.     print "Exercise 7."
  562.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (3, 3)
  563.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (6, 6)
  564.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (10, 1)
  565.     print $ closestPoint [(0, 0), (0, 10), (10, 0), (10, 10)] $ (1, 10)
  566.     -}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement