| |||
![]()
|
![]() ![]() |
![]()
красивые грабли: OCaml о прекрасном. написал чудесный функтор module type Holder = sig type t end module Comparable(H:Holder) = struct type t = H.t let compare = compare end прекрасно применяется, между прочим, к целым, строкам, декартовым произведениям, вариантам ... и всё бы было ничего, но функция lim f eq start = let next = f start in if (eq start next) then next else lim f eq next (которая весьма полезна для набивки множеств, получения связных компонент графов и всего такого прочего) у меня зациклилась (на Map[Comparable[Set[...]]] и этот самый compare = 0) не будь, как тот медведь: compare действительно определяет структурную эквивалентность базовых типов - т.е. сравнение того, что лежит внутри. но у множеств внутри лежат сбалансированные деревья, и вот они-то множеством определяются неоднозначно: зависят от порядка закладки туда элементов. посему, кстати, у Set и Map есть свой compare, правильный |
||||||||||||||
![]() |
![]() |