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 を返したらそれを返して終わりにする

val maybe : 'a -> 'a option -> 'a
val (<::>) : 'a -> 'a list option -> 'a list option

monadic cons

val foldM : ('a -> 'b -> 'a option) -> 'a -> 'b list -> 'a option

monadic fold_left

  • f を適用して,Some が帰ってきたら fold を続ける.
  • もし一度でも None が帰ってきたら,None を返す
module DList = Util__.Dlist

load Doubly linked list

val partitionEithers : ('a'b) Stdlib.Either.t list -> 'a list * 'b list

Either 型の要素のリストを左右に振り分ける

val read_file : string -> string

read lines from the given file

val indent : int -> string -> string

Add 4 * n white spaces to the head of the string

  • "\t" の方が良いかも
val index_of : 'a -> 'a list -> int option

リストの要素の添字番号を取得する

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_lefti : (int -> 'a -> 'b -> 'a) -> 'a -> 'b list -> 'a

List.fold_left with indices

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: もっと効率の良い実装にする.キューを使うなど
val whileM : ('a -> 'a option) -> 'a -> 'a

Monadic while. Tail recursive.

parameter f

Option 型を返す関数

parameter x

最初の入力値

returns

f をゼロ回以上適用して None になったら,その直前の x を返す

val dropLast1 : 'a list -> 'a list

リストの末尾を除去したリストを返す

val get_dup_opt : 'a list -> 'a option

リストの要素の重複を取得する

val filter_mapi : ('a -> 'b) -> 'a list -> 'b list

filter_map with indices

val shuffle : 'a list -> 'a list

randomize list