Welcome to utop version 2.16.0 (using OCaml version 4.14.1)! utop[0]> let rec square_list_naive l = match l with [] -> [] | e :: tl -> e * e :: square_list_naive tl;; val square_list_naive : int list -> int list = utop[1]> square_list_naive [1;2;3;4];; - : int list = [1; 4; 9; 16] utop[2]> let square_list l = let rec aux l lc = match l with [] -> lc | e :: tl -> aux tl (e * e :: lc) in aux l [];; val square_list : int list -> int list = utop[3]> square_list [1;2;3;4];; - : int list = [16; 9; 4; 1] utop[4]> let square_list l = let rec aux l lc = match l with [] -> lc | e :: tl -> aux tl (e * e :: lc) in List.rev (aux l []);; val square_list : int list -> int list = utop[5]> let cube_list l = let rec aux l lc = match l with [] -> lc | e :: tl -> aux tl (e * e * e :: lc) in List.rev (aux l []);; val cube_list : int list -> int list = utop[6]> cube_list [1;2;3;4];; - : int list = [1; 8; 27; 64] utop[7]> let f_list f l = let rec aux l lc = match l with [] -> lc | e :: tl -> aux tl (f e :: lc) in List.rev (aux l []);; val f_list : ('a -> 'b) -> 'a list -> 'b list = utop[8]> f_list (fun e -> e * e * e) [1;2;3;4];; - : int list = [1; 8; 27; 64] utop[9]> f_list (fun e -> e * e) [1;2;3;4];; - : int list = [1; 4; 9; 16] utop[10]> f_list (fun e -> e >= 3) [1;2;3;4];; - : bool list = [false; false; true; true] utop[11]> f_list;; - : ('a -> 'b) -> 'a list -> 'b list = utop[12]> List.map;; - : ('a -> 'b) -> 'a list -> 'b list = utop[13]> let square_list l = List.map (fun x -> x * x) l;; val square_list : int list -> int list = utop[14]> let l = f_list (fun e -> e >= 3) [1;2;3;4];;;; val l : bool list = [false; false; true; true] utop[15]> l ;; - : bool list = [false; false; true; true] utop[16]> let l = f_list (fun e -> e * e) [1;2;3;4];; val l : int list = [1; 4; 9; 16] utop[17]> l;; - : int list = [1; 4; 9; 16] utop[18]> List.filter (fun x -> x mod 2 = 0) l;; - : int list = [4; 16] utop[19]> List.filter;; - : ('a -> bool) -> 'a list -> 'a list = utop[20]> List.find_all;; - : ('a -> bool) -> 'a list -> 'a list = utop[21]> List.mem 10 l;; - : bool = false utop[22]> List.mem 1 l;; - : bool = true utop[23]> List.find;; - : ('a -> bool) -> 'a list -> 'a = utop[24]> List.find (fun x -> x mod 2 = 1) l;; - : int = 1 utop[25]> l;; - : int list = [1; 4; 9; 16] utop[26]> List.find (fun x -> x mod 5 = 1) l;; - : int = 1 utop[27]> List.find (fun x -> x mod 5 = 0) l;; Exception: Not_found. utop[28]> None;; - : 'a option = None utop[29]> Some 1;; - : int option = Some 1 utop[30]> let rec find_if pred l = match l with [] -> None | e :: tl -> if pred e then e else find_if pred tl;; val find_if : ('a option -> bool) -> 'a option list -> 'a option = utop[31]> find_if (fun x -> x mod 5 = 0) l;; Error: This expression has type 'a option but an expression was expected of type int utop[32]> let rec find_if pred l = match l with [] -> None | e :: tl -> if pred e then Some e else find_if pred tl;; val find_if : ('a -> bool) -> 'a list -> 'a option = utop[33]> find_if (fun x -> x mod 5 = 0) l;; - : int option = None utop[34]> find_if (fun x -> x mod 5 = 1) l;; - : int option = Some 1 utop[35]> type pair = P of int * int;; type pair = P of int * int utop[36]> P(1,2) ;; - : pair = P (1, 2) utop[37]> let pair_cmp pair = let P(x, y) = pair in if x > y then 1 else if x < y then -1 else 0;; val pair_cmp : pair -> int = utop[38]> let pair_cmp pair = match pair with P(x, y) when x > y -> 1 | P(x, y) when x < y -> -1 | _ -> 0;; val pair_cmp : pair -> int = utop[39]> let pair_cmp = function P(x, y) when x > y -> 1 | P(x, y) when x < y -> -1 | _ -> 0;; val pair_cmp : pair -> int = utop[40]> pair_cmp (P(1,2));; - : int = -1 utop[41]> pair_cmp (P(2,2));; - : int = 0 utop[42]> pair_cmp (P(2,1));; - : int = 1 utop[43]> Sys.getenv("HOME");; - : string = "/home/idurand" utop[44]> Sys.getenv("PRINTER");; - : string = "MG6200" utop[45]> Sys.getenv_opt("PRINTER");; - : string option = Some "MG6200" utop[46]> Sys.getenv_opt("PRINT");; - : string option = None utop[47]> Sys.getpwd();; Error: Unbound value Sys.getpwd Hint: Did you mean getcwd? utop[48]> Sys.getcwd;; - : unit -> string = utop[49]> Sys.getcwd ();; - : string = "/home/idurand/Enseignement/PROG-FONC/prog-fonc/CM/CM06-2025-10-07" utop[50]> Sys.time;; - : unit -> float = utop[51]> Sys.time ();; - : float = 2.437024 utop[52]> Sys.time ();; - : float = 2.45680499999999968 utop[53]> let start = Sys.time ();; val start : float = 2.50805399999999956 utop[54]> Sys.time () - start;; Error: This expression has type float but an expression was expected of type int utop[55]> Sys.time () -. start;; - : float = 0.0534620000000005646 utop[56]> let time f = let start = Sys.time () in let _ = f () in Sys.time () -. start;; val time : (unit -> 'a) -> float = utop[57]> time;; - : (unit -> 'a) -> float = utop[58]> List.init;; - : int -> (int -> 'a) -> 'a list = utop[59]> List.init 10 (fun i -> i) ;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9] utop[60]> List.init 10 (fun i -> i * i) ;; - : int list = [0; 1; 4; 9; 16; 25; 36; 49; 64; 81] utop[61]> let l = List.init 100 (fun i -> i * i) ;; val l : int list = [0; 1; 4; 9; 16; 25; 36; 49; 64; 81; 100; 121; 144; 169; 196; 225; 256; 289; 324; 361; 400; 441; 484; 529; 576; 625; 676; 729; 784; 841; 900; 961; 1024; 1089; 1156; 1225; 1296; 1369; 1444; 1521; 1600; 1681; 1764; 1849; 1936; 2025; 2116; 2209; 2304; 2401; 2500; 2601; 2704; 2809; 2916; 3025; 3136; 3249; 3364; 3481; 3600; 3721; 3844; 3969; 4096; 4225; 4356; 4489; 4624; 4761; 4900; 5041; 5184; 5329; 5476; 5625; 5776; 5929; 6084; 6241; 6400; 6561; 6724; 6889; 7056; 7225; 7396; 7569; 7744; 7921; 8100; 8281; 8464; 8649; 8836; 9025; 9216; 9409; 9604; 9801] utop[62]> List.mem 9801 l;; - : bool = true utop[63]> time (fun () -> List.mem 9801 l);; - : float = 7.00000000009026735e-06 utop[64]> let rec iota_quad n = (* O(n^2) *) if n = 0 then [] else iota_quad (pred n) @ (pred n);; Error: This expression has type int but an expression was expected of type 'a list utop[65]> let rec iota_quad n = (* O(n^2) *) if n = 0 then [] else iota_quad (pred n) @ [pred n];; val iota_quad : int -> int list = utop[66]> iota_quad 5;; - : int list = [0; 1; 2; 3; 4] utop[67]> let iota n = (* O(n) *) let rec aux i = if i = n then [] else i :: aux (succ i) in aux 0;; val iota : int -> int list = utop[68]> iota 5;; - : int list = [0; 1; 2; 3; 4] utop[69]> let iota_rt n = (* O(n) *) let rec aux i l = if i = -1 then l else aux (pred i) (n :: l) in aux n [];; val iota_rt : int -> int list = utop[70]> iota_quad 1000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[71]> let _ = iota_quad 1000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[72]> let _ = iota_quad 10000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[73]> let _ = iota_quad 10000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[74]> let _ = iota 10000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[75]> let _ = iota_quad 100000;; Interrupted. utop[76]> let _ = iota 100000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[77]> let _ = iota 1000000;; Stack overflow during evaluation (looping recursion?). utop[78]> let _ = iota_rt 1000000;; - : int list = [1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; 1000000; ...] utop[79]> iota_rt 10;; - : int list = [10; 10; 10; 10; 10; 10; 10; 10; 10; 10; 10] utop[80]> let iota_rt n = (* O(n) *) let rec aux i l = if i = -1 then l else aux (pred i) (n :: l) in aux (pred n) [];; val iota_rt : int -> int list = utop[81]> iota_rt 10;; - : int list = [10; 10; 10; 10; 10; 10; 10; 10; 10; 10] utop[82]> let iota_rt n = (* O(n) *) let rec aux n l = if i = -1 then l else aux (pred n) (n :: l) in aux (pred n) [];; Error: Unbound value i utop[83]> let iota_rt n = (* O(n) *) let rec aux n l = if n = -1 then l else aux (pred n) (n :: l) in aux (pred n) [];; val iota_rt : int -> int list = utop[84]> iota_rt 10;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9] utop[85]> let _ = iota_rt 1000000;; - : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112; 113; 114; 115; 116; 117; 118; 119; 120; 121; 122; 123; 124; 125; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 136; 137; 138; 139; 140; 141; 142; 143; 144; 145; 146; 147; 148; 149; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 161; 162; 163; 164; 165; 166; 167; 168; 169; 170; 171; 172; 173; 174; 175; 176; 177; 178; 179; 180; 181; 182; 183; 184; 185; 186; 187; 188; 189; 190; 191; 192; 193; 194; 195; 196; 197; 198; 199; 200; 201; 202; 203; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 217; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 268; 269; 270; 271; 272; 273; 274; 275; 276; 277; 278; 279; 280; 281; 282; 283; 284; 285; 286; 287; 288; 289; 290; 291; 292; 293; 294; 295; 296; 297; 298; ...] utop[86]> time (fun () -> iota_rt 1000000);; - : float = 0.128715999999997166 utop[87]> time (fun () -> iota 1000000);; Stack overflow during evaluation (looping recursion?). utop[88]> time (fun () -> iota 100000);; - : float = 0.00890100000000160207 utop[89]> time (fun () -> iota_rt 100000);; - : float = 0.00573899999999838428 utop[90]> List.iter;; - : ('a -> unit) -> 'a list -> unit = utop[91]> print_int;; - : int -> unit = utop[92]> print_int 100;; 100- : unit = () utop[93]> List.iter print_int [1; 2; 3];; 123- : unit = () utop[94]> let x = List.iter print_int [1; 2; 3];; 123val x : unit = () utop[95]> x ;; - : unit = () utop[96]> let filter pred l = let r = ref [] in begin List.iter (fun e -> if pred e then r := e :: !r) l; !r end;; val filter : ('a -> bool) -> 'a list -> 'a list = utop[97]> filter (fun x -> x mod 2 = 0) [1;2;3;4];; - : int list = [4; 2] utop[98]> let filter pred l = let r = ref [] in begin List.iter (fun e -> if pred e then r := e :: !r) l; List.rev !r end;; val filter : ('a -> bool) -> 'a list -> 'a list = utop[99]> filter (fun x -> x mod 2 = 0) [1;2;3;4];; - : int list = [2; 4] utop[100]> List.fold_left;; - : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = utop[101]> List.fold_left ( + ) 0 [1;2;3;4];; - : int = 10 utop[102]> List.fold_left ( * ) 1 [1;2;3;4];; - : int = 24 utop[103]> List.fold_left;; - : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = utop[104]> List.fold_right ;;; - : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = utop[105]> List.append;; - : 'a list -> 'a list -> 'a list = utop[106]>