Ngày hôm qua Wikibender bắt đầu bằng this stackoverflow qestion trên Comonads kết thúc tại MarkCC's bài viết trên Finger Trees.Tìm chữ “Giảm” Typeclass từ Cây Finger Điều
Trong bài viết, ông sử dụng rộng rãi loại lớp học Reduce
. Anh ấy viết về kiểu chữ này như thể nó là một thư viện rất phổ biến và thường xuyên sử dụng, nhưng tôi không thể tìm thấy nó trên hackage, cũng như tôi không thể tìm đủ tài liệu để thực sự hiểu được mã.
Ai đó có thể giúp tôi hiểu những gì máy đánh chữ Reduce
đang hoạt động, cách các toán tử (-<)
và (>-)
hoạt động và điều gì sẽ cho tôi biết về mã trong bài viết (được sao chép bên dưới)?
Mã từ Finger Trees Done Right (I hope):
Liệt kê 1: khai dụ cho Node
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
Liệt kê 2: khai dụ cho 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 (>-))
niêm yết 3: Dữ liệu các loại
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 ]