Don't like ads? PRO users don't see any ads ;-)

Haskell Lection 28.03

By: GreenApple on Mar 28th, 2012  |  syntax: Haskell  |  size: 3.48 KB  |  hits: 54  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. -- лямбда исчисления Чёрч
  2. -- машина М0, хотим добавить к ней переменные и функции
  3. -- форма\ьно опреде\иммашину М1, которая умеет исчислять:
  4.         -- (x+y-1)*2
  5.         -- если Е выражение а х переменная, то \x.E выражение, где \ - лямбда
  6.         -- если Е1 и Е2 выражение, то (E1)Е2 выражение
  7.        
  8.         -- \x.(x+y-1)*2 по значению x возвращает функцию, зависящаю от x
  9.         -- (\x.(x+y-1)*2)3 при x = 3 -> (3+y-1)*2 -> (2+y)*2
  10. -- М1 упрощает такие штуки, пока есть что упрощатьави
  11. -- альфа преобразование - замена машиной значения под \
  12. -- бета преобразование - подставление аргумента вместо переменной(редукция)
  13. -- дельта преобразование - применение машины М0, т.е. упрощение выражения
  14.  
  15. -- Теорема Чёрча
  16.         -- о том, что результаты однозначны с точностью до альфа-преобразования(имен переменных) вне зависимости от порядка преобразований (если нас не зациклит)
  17.        
  18. -- inc x = x+1                  =>               inc = \x -> x+1
  19. -- add x y = x+y                =>               add = \xy -> x+y, \x -> (\y->x+y)
  20.  
  21. -- x:xs - голова:хвост
  22. len::[a]->Int
  23. -- len [] = 0;
  24. -- len (x:xs) = 1 + len xs
  25.  
  26. len xs = len' xs 0 where
  27.         len' [] n = n;
  28.         len' (x:xs) n = len' xs (n+1)
  29.  
  30.  
  31. main = print $ show $ len [1,2,3,4,5,6,7,8,9,10] --[1..10], [1,3..10] = [1,3,5,7,9,] [1..] = бесконечный список с 1
  32. -- генераторы списков
  33. f xs = [2*x|x <- xs, x>0]
  34. [(x,y,z)|x<-[0,1], y<-[0,1], z<-[0,1]] -- самый правый меняется быстрее
  35. -- 000 001 010 011 100 101 110 111
  36. tirplex::Int->[(Int, Int, Int)]
  37. triplex n = [(a, b, c)| a<-[1..n], b<-[1..a], c<-[a..n], a*a + b*b == c*c]
  38. -- ######################################################################################################### --
  39.  
  40. String = [Char]
  41. "abc" = ['a', 'b', 'c']
  42.  
  43. filter(\x->x>0) [-5, 5]
  44. filter(>0) [-5, 5]
  45.  
  46. map (+1) [1..10]
  47. map (/2) [1..10]
  48. map (2/) [1..10]
  49. map inc [1..10]
  50.  
  51. -- ######################################################################################################### --
  52. -- как определить свою операцию
  53. (*^*+*^*):: Int->Int->Int
  54. (*^*+*^*)x y = x + y - 2
  55.  
  56. -- ######################################################################################################### --
  57. -- map - функция высшего порядка, ибо ей на вход передается другая функция
  58. -- zipWith (binFun, xs, ys)
  59. zipWith (+) [1..3][4..6] -- => [1+4, 2+5, 3+6] => [5,7,9]
  60. zip xs ys
  61. zip [1..3] [4..6] --=>[(1,4), (2,5), (3,6)]
  62. -- могут работать со списками разной длины, но результат будет равен по длине меньшему
  63. unzip [(1,4), (2,5), (3,6)] --=> ([1..3], [4..6])
  64.  
  65. dot xs ys = sum $ zipWith (*) xs ys --скалярное произведение
  66.  
  67. -- ######################################################################################################### --
  68.  
  69. -- 1    1       2
  70.    -- \   /
  71. -- 1    1       2
  72. fibb = 1:1:(zipWith(+) fibb (tail fibb))
  73. f n = fibb !! n --n-элемент списка fibb