48 lines
1.1 KiB
OCaml
48 lines
1.1 KiB
OCaml
let m = [ ("dog", 1); ("chicken", 2); ("dog", 3); ("cat", 5) ]
|
||
|
||
let rec lookup_all s m =
|
||
match m with
|
||
| [] -> []
|
||
| (name,value)::ms ->
|
||
let rest = lookup_all s ms
|
||
in if s = name then value :: rest else rest
|
||
|
||
(* find all by : (’a -> ’a ->bool) -> ’a ->
|
||
’a list -> ’a list
|
||
*)
|
||
let streq s1 s2 = s1 = s2
|
||
let check (s,i) s' = s = s'
|
||
let rec find_all_by eq v l =
|
||
match l with
|
||
| [] -> []
|
||
| x::xs -> if eq x v
|
||
then x :: find_all_by eq v xs
|
||
else find_all_by eq v xs
|
||
|
||
let rec snds l =
|
||
match l with
|
||
| [] -> []
|
||
| (f,s)::rest -> s :: snds rest
|
||
|
||
let rec find_all_with f lst = match lst with
|
||
| [] -> []
|
||
| x::xs ->
|
||
let rest = find_all_with f xs
|
||
in if f x then x::rest else rest
|
||
|
||
let find_all_by' eq e lst = find_all_with (fun x -> eq x e) lst
|
||
|
||
(*
|
||
drop_while even [2;4;6;8;9;4;2] ==> [9;4;2]
|
||
drop_until even [1;3;5;2;4;6;8;9;4;2] ==> [2;4;6;8;9;4;2]
|
||
*)
|
||
|
||
(* flip: ('a -> 'b -> 'c) -> ('b -> ('a -> 'c)) *)
|
||
let flip f x y = f y x
|
||
|
||
|
||
(* (’b->’c)->(’a->’b)->(’a->’c) *)
|
||
let compose f g x = f (g x)
|
||
|
||
|
||
|