Поиск пропущенного класса типов "Reduce" в статье Finger Tree

Вчерашний Wikibender , который начался с этого вопроса о переполнении стека на Comonads, закончился в статье MarkCC о Finger Trees .

В статье он широко использует класс типа Reduce . Он пишет об этом классе типов, как если бы это была очень распространенная и часто используемая библиотека, но я не могу найти ее на взломе и не могу найти достаточно документации, чтобы действительно понять код.

Может ли кто-нибудь помочь мне понять, что делает класс типов Reduce , как работают операторы (- и (> -) и что должны расскажите мне о коде в статье (скопирован ниже)?


Листинг кода из Finger Trees Done Right (я надеюсь) :

Листинг 1: объявление экземпляра для узла

instance Reduce Node where
  reducer (-<) (Node2 a b) z = a -< (b -< z)
  reducer (-<) (Node3 a b c) z = a -< (b -< (c -< z))
  reducer (>-) (Node2 b a) = (z >- b) >- a
  reducer (>-) (Node3 c b a) = ((z >- c) >- b) >- a

Листинг 2: объявление экземпляра для FingerTree

instance Reduce FingerTree where
  reducer (-<) Empty zero = zero
  reducer (-<) (Single x) zero = x -< zero
  reducer (-<) Deep left mid right zero = left -<' (mid -<'' (right -<' zero))
    where (-<') = reducer (-<)
          (-<'') = reducer (reducer (-<))
  reducel (>-) zero Empty = zero
  reducel (>-) zero (Single x) = zero >- x
  reducel (>-) zero (Deep left mid right) = ((zero >-' left) >-'' mid) >-' right
    where (>-') = reducel (>-)
          (>-'') = reducel (reducel (>-))

листинг 3: типы данных

data Node s = Node2 s s | Node3 s s s

data FingerTree a = Empty
  |  Single a
  | Deep (Digit a) (FingerTree (Node a)) (Digit a)

data Digit a = [ a ]

9
задан Community 23 May 2017 в 12:24
поделиться