Comonadsでのこのstackoverflowqestionで始まった昨日のWikibenderは、FingerTreesに関するMarkCCの記事に行き着きました。
Reduce
この記事では、彼は型クラスを多用しています。彼はこの型クラスについて、非常に一般的で頻繁に使用されるライブラリであるかのように書いていますが、ハッキングでは見つけることができず、コードを実際に理解するのに十分なドキュメントも見つかりません。
Reduce
誰かが型クラスが何をしているのか、演算子(-<)
と演算子がどのように機能するのか、そして(>-)
記事(以下にコピー)のコードについて何を教えてくれるのかを理解するのを手伝ってもらえますか?
正しく行われたフィンガーツリーからのコードリスト(私は願っています) :
リスト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 ]