Advertisement
Guest User

f#

a guest
Nov 20th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 6.75 KB | None | 0 0
  1. open System
  2.  
  3. let pow i n = i ** (float n)
  4.  
  5. let rec iter i predicate f acc =
  6.     if (predicate acc) then
  7.         iter (i+1) predicate f (f acc i)
  8.     else
  9.         acc
  10.  
  11. let smart_f (el, sum, x) i =
  12.     let step = el * (-1. / 9.) * pow x 2
  13.     (step, sum + step, x)
  14.  
  15. let predicate (el, sum, x) = System.Math.Abs(el:float) > System.Double.Epsilon
  16.  
  17. let tailor_sum_smart x =
  18.     let (el, sum, x) = iter 0 predicate smart_f (-1., 0., x)
  19.     sum
  20.    
  21. //
  22. //let naive_f (_, sum, x) i =
  23. //    let step = pow -1. i * pow x (2*i + 1) / pow 9. (i + 1)
  24. //    (step, sum + step, x)
  25. //
  26. //let tailor_sum_naive x =
  27. //    let (el, sum, x) = iter 0 predicate naive_f (-1., 0., x)
  28. //    sum
  29. //    
  30. //tailor_sum_naive -1.0
  31.  
  32. //let compute_i_element_naive i x =
  33. //let series_sum_naive i acc x =
  34. //    acc + compute_i_element_naive i x
  35. //
  36. //let series_start x = x / 9.
  37. //
  38. //let compute_i_element_smart prev i x = -1. * prev * 9. * pow x 2  
  39. //
  40. //
  41. //
  42. //
  43. //
  44. //iter 0 10 series_sum_naive series_start 1.0
  45. //
  46. //
  47. //
  48.  
  49. // lecture 2
  50.  
  51. // question about predicates
  52.  
  53.  
  54. let rec fmin = function
  55. | [x] -> (x, [])
  56. | x::xs ->
  57.     let (z, zs) = fmin xs
  58.     if z > x then (x, xs)
  59.     else (z, x::zs)
  60.  
  61. let rec sort = function
  62. | [] -> []
  63. | [x] -> [x]
  64. | L ->
  65.     let (x, xs) = fmin L;
  66.     x::sort xs
  67.  
  68. sort [3;2;1]
  69.  
  70.  
  71. let rec fold f i = function
  72. | [] -> i
  73. | x::xs -> f x (fold f i xs)
  74.  
  75.  
  76.  
  77.  
  78. let sum = fold (+) 0
  79. sum [1..100]
  80.  
  81. let head (x::_) = x
  82. let tail = function x::xs -> xs
  83.  
  84.  
  85. let minel L = fold min (List.head L) L
  86. //let minel = fold min (System.Int32.MaxValue)
  87. let length L = fold (fun _ acc -> acc+1) 0 L
  88.  
  89. let minmax L = fold (fun x (mi, ma) -> (min mi x, max ma x)) (List.head L, List.head L) L
  90.  
  91. List.map ((*)2) [1;2;3]
  92.  
  93. let flip f x y = f y x
  94.  
  95. //let divisible_by number i =
  96. //[2..100] |> List.filter ()
  97.  
  98. let rec eratosphenes = function
  99.     | [] -> []
  100.     | x::xs -> x::(eratosphenes (List.filter (flip (%) x >> (<) 0) xs))
  101.  
  102. eratosphenes [2..100]
  103.  
  104.  
  105. // seminar 3
  106. // permutations
  107.  
  108. let rec ins x = function
  109. | [] -> [[x]]
  110. | y::ys as l ->
  111.     let L = ins x ys
  112.     let N = List.map (fun z -> y::z) L
  113.     (x::l)::N
  114.  
  115. //ins 0 [1;2;3]
  116.  
  117. // [1;2;3]
  118. let rec perm = function
  119. | [] -> [[]]
  120. | x::xs as l -> // x = 1; xs = [2;3]
  121.     let L = perm xs // [[2;3];[3;2]]
  122.     let M = List.map (fun t -> ins x t) L // [ list of insertions; list of insertions ]
  123.     List.concat M // collect all insertions into one list
  124.     // List.mapconcat -> List.collect (f, list)
  125.    
  126. perm [1..3]
  127.  
  128.  
  129. //let rec foldr f i = function
  130. //| [] -> i
  131. //| x::xs -> f x (fold f i xs)
  132. //
  133. //foldr (fun x acc -> "f(" + string(x)+","+acc+")") "empty" [1;2;3]
  134.  
  135. let foldl f i L =
  136.     let rec fold' acc f = function
  137.    | [] -> acc
  138.    | x::xs -> fold' (f x acc) f xs
  139.     fold' i f L
  140.    
  141. foldl (fun x acc -> "f("+string(x)+","+acc+")") "empty" [1;2;3]
  142.  
  143. //let rec rev = function
  144. //| [] -> []
  145. //| x::xs -> (rev xs)@[x]  @ - append, x::xs - concat
  146. //
  147. //let rec rev' acc = function
  148. //| [] -> acc
  149. //| x::xs -> rev' (x::acc) xs
  150.  
  151. //
  152. let rev L = foldl (fun x acc -> x::acc) [] L
  153.  
  154.  
  155.  
  156. // arrays
  157.  
  158. let A = [|1;2;3|]
  159. A.[1] <- 0
  160. A.[1..5] // slicing
  161.  
  162.  
  163. // pascal triangle
  164.  
  165.  
  166.  
  167. let uncurry f (x,y) = f x y
  168.  
  169. let pascal i =
  170.     let rec pascal' a b L =
  171.        if (a < b) then
  172.            let s = List.map (uncurry (+)) (List.pairwise (List.head L))
  173.            pascal' (a+1) b ((1::s@[1])::L)
  174.         else
  175.             L
  176.     pascal' 0 i [[1]]
  177. pascal 5
  178.  
  179. type 't queue = 't list * 't list
  180.  
  181. let put x (L,M) = (L, x::M)
  182. let rec get = function
  183. | ([],[]) -> failwith "Oh no!"
  184. | ([], M) -> get (rev M , [])
  185. | (x::xs, L) -> (x, (xs, L))
  186.  
  187.  
  188.  
  189.  
  190. let scalarProduct1 = List.reduce (+) << uncurry (List.map2 (*))
  191.  
  192.  
  193. // trees
  194.  
  195. type 't tree =
  196.    | Nil
  197.    | Node of 't *'t tree * 't tree
  198.    
  199. let Leaf x = Node(x, Nil, Nil)    
  200. let t = Node(0, Leaf(1), Node(2,Leaf(3),Nil))
  201.  
  202. let ex = Node('+', Leaf('1'), Node('*', Leaf('1'),Leaf('2')))
  203.  
  204. //traversal
  205. //
  206. //type trav_order = Prefix | Infix | Postfix
  207. //
  208. //let rec traverse f order = function
  209. //| Nil -> ()
  210. //| Node(x,l,r) ->
  211. //    match order with
  212. //    | Prefix ->  f x; traverse f order l; traverse f order r
  213. //    | Infix -> traverse f order l; f x; traverse f order r
  214. //    | Postfix -> traverse f order l; f x; traverse f order r
  215. //
  216. //    
  217. //traverse (printf "%A ") Prefix ex    
  218.  
  219. let Prefix n l r = n();l();r()
  220. let Infix n l r = l();n();r()
  221. let Postfix n l r = l();r();n()
  222.  
  223. let rec traverse order f = function
  224. | Nil -> ()
  225. | Node(x,l,r) ->
  226.     order (fun () -> f x) (fun () -> traverse order f l) (fun () -> traverse order f r)
  227.    
  228.  
  229. traverse Postfix (printf "%A ") ex    
  230.  
  231. let rec treefold f acc = function
  232. | Nil -> acc
  233. | Node(x,l,r) ->
  234.     let x1 = treefold f acc l
  235.     let x2 = f x x1
  236.     treefold f x2 r
  237.    
  238. treefold (fun a b -> string(a)+string(b)) "" ex
  239.  
  240.  
  241. let rec insert x = function
  242. | Nil -> Leaf(x)
  243. | Node(z,l,r) as N ->
  244.     if (x < z) then Node(z, insert x l, r)
  245.     elif (x > z) then Node(z, l, insert x r)
  246.     else N
  247.    
  248. let rnd = new System.Random()
  249.  
  250. let flip' f x y = f y x
  251. let curry f x y = f(x,y)
  252.  
  253. let l = [for x in [1..10] -> rnd.Next(1,100)]
  254.  
  255. l |> List.fold (flip' insert) Nil |> treefold (curry List.Cons) []
  256.  
  257. // calculate freq dict
  258. let rec insert' x = function
  259. | Nil -> Leaf(x, 0)
  260. | Node((z,n),l,r) as N ->
  261.    if (x < z) then Node((z,n), insert' x l, r)
  262.     elif (x > z) then Node((z,n), l, insert' x r)
  263.    else Node((x, n+1), l, r)
  264.    
  265.  
  266.  
  267. open System.IO
  268. let freq_tree =
  269.    File.ReadAllLines(@"")
  270.    |> Array.collect (fun s -> s.Split([|' ';'-';',';';';'!';'?';|]))
  271.    |> Array.filter (fun x -> x.Length > 0)
  272.    |> Array.fold (flip insert') Nil
  273. //    |> treefold (curry List.Cons) []
  274. //    |> List.sortBy ((~-) << snd)
  275. //    |> List.take 5
  276.    
  277. let rec treesize = function
  278. | Nil -> 0
  279. | Node(_,l,r) -> 1 + treesize l + treesize r
  280.  
  281. treesize freq_tree    
  282.  
  283. //continuations
  284.  
  285. 5 |> (+) 1 |> (*) 2 |> printf "%d"
  286. let plus1 x f= f(x + 1)
  287. let times2 x f = f(x*2)
  288.  
  289. plus1 5 (fun x ->  times2 x (printf "%d"))  
  290.  
  291. let rec len f = function
  292. | [] -> f 0
  293. | _::t -> len ((+) 1 << f) t    
  294.  
  295. len id [1..10]
  296.  
  297.  
  298. let rec size' f = function
  299. | Nil -> f 0
  300. | Node(_,l,r) ->
  301.    l |> size' (fun x1 ->
  302.         r |> size' (fun x2 -> f(1 + x1 + x2)))
  303.        
  304. size' id freq_tree      
  305.  
  306.  
  307.  
  308. // closures and generators
  309.  
  310. let create_counter f x =
  311.     let mutable c = x
  312.     fun () ->
  313.         c<-f c; c
  314.        
  315. let fibgen = create_counter (fun (x,y)-> (x+y, x)) (1I,1I)
  316. fibgen()      
  317.  
  318. let map' f g =
  319.    fun () -> f(g())
  320.  
  321. let rec filter' f g =
  322.     fun () ->
  323.         let x = g()
  324.         if f x then x else (filter' f g)()
  325.  
  326. let fibs = fibgen |> map' fst |> filter' (fun x -> x>1000000001I)
  327. fibs()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement