Использование Ocaml Map to_seq - PullRequest
       8

Использование Ocaml Map to_seq

0 голосов
/ 15 апреля 2020

Скажем, у меня есть следующее

module IntPairs =
   struct
     type t = int * int
     let compare (x0,y0) (x1,y1) =
       match Stdlib.compare x0 x1 with
           0 -> Stdlib.compare y0 y1
         | c -> c
   end

module PairsMap = Map.Make(IntPairs)

И я добавляю несколько элементов:

let m = PairsMap.(empty |> add (1,1) 1 |> add (2,1) 1 |> add (1,2) |> add (2,2))

Как бы я использовал to_seq для печати ключей в порядке возрастания? Я не знаком с итераторами в ocaml

1 Ответ

0 голосов
/ 15 апреля 2020

Это скорее запрос на обучение OCaml, чем вопрос о конкретной c проблеме в вашем коде. Как правило, читать документацию быстрее, чем задавать отдельные вопросы здесь, в StackOverflow.

При этом интерфейс Seq выглядит следующим образом:

type 'a t = unit -> 'a node
and 'a node = Nil | Cons of 'a * 'a t
val empty : 'a t
val return : 'a -> 'a t
val map : ('a -> 'b) -> 'a t -> 'b t
val filter : ('a -> bool) -> 'a t -> 'a t
val filter_map : ('a -> 'b option) -> 'a t -> 'b t
val flat_map : ('a -> 'b t) -> 'a t -> 'b t
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
val iter : ('a -> unit) -> 'a t -> unit

Как вы можете видеть , он предлагает много функций обхода высшего порядка. Вероятно, вы захотите использовать iter, поскольку вы хотите печатать значения, а не вычислять их. То есть, нет возвращаемого значения для желаемого использования.

Однако вы должны заметить, что интерфейс Map уже имеет функцию iter. Насколько я могу судить, нет причин для преобразования в последовательность перед выполнением итерации. Документация Map.iter гласит следующее:

Связывания передаются в f в порядке возрастания в отношении упорядочения по типу ключей.

Вот что Вы хотите, так что Map.iter похоже, что это добьется цели.

PairsMap.iter my_print_function m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...