このコードには、繰り返されるフラグメントがあります。
insert x (AATree t) = case insert' x t of
Same t -> AATree t
Inc t -> AATree t
insertBlack :: (Ord a) => a -> AANode Black (Succ n) a -> AnyColor (Succ n) a
insertBlack x (Black l y r)
| x < y = case insert' x l of
Same l' -> AnyColor $ Black l' y r
Inc l' -> AnyColor $ skew l' y r
| otherwise = case insert' x r of
Same r' -> AnyColor $ Black l y r'
Inc r' -> AnyColor $ Red l y r'
したがって、関数を作成するのは魅力的です。
insert2 same inc x l = case insert' x l of
Same aa -> same aa
Inc aa -> inc aa
そして、どこでもそれを使用してください、例えば:
insert x (AATree t) = insert2 AATree AATree x t
書く方法はありますinsert2
か?素朴なアプローチはタイプチェックしません。