Module Util
Utility functions.
- 基本的なコンビネータ,双方向連結リストなど
include basic combinators
include Util__.Combinator
val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
val id : 'a -> 'a
val const : 'a -> 'b -> 'a
val curry : (('a * 'b) -> 'c) -> 'a -> 'b -> 'c
val uncurry : ('a -> 'b -> 'c) -> ('a * 'b) -> 'c
val first : ('a -> 'b) -> ('a * 'c) -> 'b * 'c
val second : ('a -> 'b) -> ('c * 'a) -> 'c * 'b
val both : ('a -> 'b) -> ('a * 'a) -> 'b * 'b
val pair : 'a -> 'b -> 'a * 'b
val swap : ('a * 'b) -> 'b * 'a
val (<.) : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
val (<..) : ('a -> 'b) -> ('c -> 'd -> 'a) -> 'c -> 'd -> 'b
val (<...) : ('a -> 'b) -> ('c -> 'd -> 'e -> 'a) -> 'c -> 'd -> 'e -> 'b
val (>>=) : 'a option -> ('a -> 'b option) -> 'b option
val let* : 'a option -> ('a -> 'b option) -> 'b option
val (<$>) : ('a -> 'b) -> 'a option -> 'b option
val let+ : 'a option -> ('a -> 'b) -> 'b option
val (<|>) : 'a option -> (unit -> 'a option) -> 'a option
val one_of : ('a -> 'b option) -> 'a list -> 'b option
f を適用してどれか一つでも Some を返したらそれを返して終わりにする
module DList = Util__.Dlist
load Doubly linked list
val fold_left_map2 : ('a -> 'b -> 'a * ('c * 'd list)) -> 'a -> 'b list -> 'a * ('c list * 'd list)
('a -> 'b -> 'a * ('c * 'd list)) -> 'a -> 'b list -> 'a * ('c list * 'd list)
2重の fold_left_map.
val rev_break_opt : ('a -> 'b option) -> 'a list -> ('b * ('a list * 'a list)) option
要素に Option を返す関数を適用して,初めて Some になったところでリストを分割する
- Some になった値も返す
- None になった部分のリストは反転して返すことに注意
rev_appned
をすると元のリストから一つ要素を除いたものになるbreak_opt (fun x -> if x > 3 then Some x else None) [1; 2; 3; 4; 5; 6] ---> Some (4, ([3; 2; 1], [5; 6]))
- Tail-recursive
- returns
a list, (Some (f a, a list) | None)
val rev_concat_append : 'a list list -> 'a list -> 'a list
Tail-recursive List.concat with List.rev_append
- リストのリストを反転させながら結合する
rev_concat [[6; 5; 4]; [3; 2]; [1]] [7; 8] ---> rev_append [1] (rev_append [3; 2] (rev_append [6; 5; 4] [7; 8])) ---> [1; 2; 3; 4; 5; 6; 7; 8]
val rev_concat : 'a list -> 'a list
Tail-recursive List.concat
- リストのリストを反転させながら結合する
rev_concat [[1; 2; 3]; [4; 5]; [6]] ---> rev_append [6] (rev_append [4; 5] (rev_append [1; 2; 3] [])) ---> [6; 5; 4; 3; 2; 1]
val fold_left_mapi : (int -> 'a -> 'b -> 'a * 'c) -> 'a -> 'b list -> 'a * 'c list
List.fold_left_map
with indices
val roll : 'a list -> 'a list
リストを "回転" する
roll [1; 2; 3; 4] ---> [2; 3; 4; 1]
- TODO: もっと効率の良い実装にする.キューを使うなど