Comonadsでthis stackoverflow qestionで始まるWikibenderがの記事Finger Treesで終了しました。フィンガーツリーから抜け落ちたタイプクラスを見つける記事
この記事では、Reduce
タイプのクラスを広く使用しています。彼は非常に一般的で頻繁に使用されるライブラリであるかのようにこのtypeclassについて書いていますが、私はhackageでそれを見つけることはできませんし、コードを本当に理解するのに十分な文書を見つけることもできません。
誰かが私にReduce
型クラスが何をしているのか、どのように(-<)
と(>-)
オペレーターの仕事を理解することができ、そして何が記事(以下コピー)内のコードを教えなければなりませんか?
コード表示Finger Trees Done Right (I hope)から:
リスト1:データ:2-3フィンガーツリー
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のインスタンス宣言:ノード
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のインスタンス宣言タイプ
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 ]