Cornell cs3110 - Chapter4 Exercises

(* Exercise: mystery operator 1 *)
let ( $ ) f x = f x;;
(* 使得函数的连续调用具有一部分右结合的特质 square $ 2 + 2 与 square 2 + 2 的运行结果分别是 16 和 6 *)

(* Exercise: repeat *)
let rec repeat f n x = 
  match n with
  | 0 -> x
  | _ -> repeat f (n - 1) (f x);;

(* Exercise: product *)
let product = function 
  | [] -> 1
  | h :: t -> List.fold_left ( * ) h t;;

(* Exercise: terse product *)
let terse_product = List.fold_left ( * ) 1;; (* Orz 我宣布 Ocaml 是世界上最美的语言 *)

(* Exercise: sum_cube_odd *)
let rec ( -- ) i j = if i > j then [] else i :: (i + 1 -- j);;

let odd x = if x mod 2 = 1 then true else false;;

let cube x = x * x * x;;

let sum = List.fold_left ( + ) 0;;

let sum_cube_add n = sum @@ List.map cube @@ List.filter odd @@ ( -- ) 0 n;;

(* Exercise: sum_cube_odd pipeline *)
let sum_cube_odd_pipe n = ( -- ) 0 n |> List.filter odd |> List.map cube |> List.fold_left ( + ) 0;;

(* Exercise: exists *)
let rec exists_rec f = function
  | [] -> false
  | h :: t -> if f h then true else (exists_rec f t);;

let exists_fold f = List.fold_left (fun x y -> x || f y) false;;

let exists_libs f l = List.fold_left ( || ) false @@ List.map f l;;

(* Exercise: library uncarried *)
let uncarried_append (l1, l2) = List.append l1 l2;;

(* Exercise: map composition *)
let map_composition = fun f g l -> List.map (fun x -> f (g x)) l;; (* f @@ g 好像无法通过类型推断 solution 应该是错了 具体解释等我学完解释器 :) *)

let map_composition_test = map_composition (fun x -> x + 1) (fun x -> x * x) [1; 2; 3; 4; 5];;

(* Exercise: more list fun *)
let greater_then_3 = List.filter (fun x -> x > 3);;

let add_1 = List.map (fun x -> x +. 1.0);;

let gather_sentence strs sep = List.fold_left (fun x y -> if x = "" then y else x ^ sep ^ y) "" strs;;

(* Exercise: association list keys *)
let keys : ('a * 'b) list -> 'a list = fun lst -> List.map (fun (x, y) -> x) lst |> List.sort_uniq compare;;

(* Exercise: valid matrix *)
let is_valid_matrix = function 
  | [] -> false 
  | m -> List.map List.length m |> List.sort_uniq compare |> List.length = 1;;

(* Exercise: row vector add *)
let add_row_vectors v1 v2 = List.map2 ( + ) v1 v2;;

(* Exercise: matrix add *)
let add_matrices m1 m2 = List.map2 add_row_vectors m1 m2;;

(* Exercise: matrix multiply *)
let transpose m = List.map (fun i -> List.map (fun x -> List.nth x i) m) (0 -- (List.length (List.hd m) - 1));;

let mul_row_vectors v1 v2 = List.fold_left ( + ) 0 @@ List.map2 ( * ) v1 v2;;

let multiply_matrices m1 m2 = List.map (fun x -> List.map (fun y -> mul_row_vectors x y) (transpose m2)) m1;;

posted @ 2024-10-02 22:14  sysss  阅读(2)  评论(0编辑  收藏  举报