Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.84 KB | None | 0 0
  1. type 'a llist = LNil | LCons of 'a * (unit -> 'a llist) (*tutaj deklarujemy(czy to dobre słowo?) typ i bez tego ani rusz *)
  2.  
  3. (*lfrom generuje ciąg rosnących liczb całkowitych zaczynający się od k.*)
  4. # let rec lfrom k = LCons (k, function () -> lfrom (k+1));;
  5. val lfrom : int -> int llist = <fun>
  6.  
  7. (*ltake(n,xl) zwraca pierwszych n elementów listy leniwej xl w postaci zwykłej
  8. listy*)
  9. # let rec ltake = function
  10. (0, _) -> []
  11. | (_, LNil) -> []
  12. | (n, LCons(x,xf)) -> x::ltake(n-1, xf())
  13. ;;
  14. val ltake : int * 'a llist -> 'a list = <fun>
  15.  
  16. (* toLazyList ze zwykłej listy tworzy listę leniwą*)
  17. #let rec toLazyList = function
  18. [] -> LNil
  19. | h::t -> LCons(h, function () -> toLazyList t);;
  20. val : toLazyList: 'a list -> 'a llist
  21.  
  22.  
  23. (*zad 1*)
  24. let l1 = [1;2;3;4;5];;
  25.  
  26. let rec replicateElements (k, list) =
  27.     let rec replicate = function
  28.         | (_, LNil) -> LNil
  29.         | (n, LCons(h, xf)) ->
  30.             if n = 0 then replicate(k, xf())
  31.             else
  32.             if (n>0) then LCons(h, fun () -> replicate (n - 1 ,LCons(h,xf))) else failwith "ujemny argument"
  33.     in replicate(k, list);;
  34.  
  35. val replicateElements : int * a'list -> a' llist = <fun>
  36.  
  37. let l2 = toLazyList l1;;
  38. ltake(5,l2);;
  39. let l3 = replicateElements(2, l2);;
  40. ltake(10,l3);;
  41.  
  42. (*zad 2*)
  43. let lfib =
  44.     let rec fib (number, acc) =
  45.         LCons(number, fun () -> fib(acc, number + acc))
  46.     in fib(0, 1);;
  47. val lfib : int llist = LCons(0, fun)
  48.  
  49. ltake(10,lfib);;
  50.  
  51.  
  52. (*wywołanie*)
  53. type 'a llist = LNil | LCons of 'a * (unit -> 'a llist)
  54.  
  55. let rec ltake = function
  56. (0, _) -> []
  57. | (_, LNil) -> []
  58. | (n, LCons(x,xf)) -> x::ltake(n-1, xf())
  59.  
  60. let rec toLazyList = function
  61. [] -> LNil
  62. | h::t -> LCons(h, function () -> toLazyList t);;
  63.  
  64. let lfib =
  65.     let rec fib (number, acc) =
  66.         LCons(number, fun () -> fib(acc, number + acc))
  67.     in fib(0, 1);;
  68.  
  69. let l1 =[1;2;3;4;5];;
  70. let l2 = toLazyList l1;;
  71. ltake(5,l2);;
  72. lfib l2;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement