花谷です。

木構造を扱っていて少しはまったので…

このMLで以前

class TreeCon t where
     children :: t a -> [t a]

というのがあればいろいろな実装に対応できるというの話題があったようですが、

data Tree a = Leaf a
             | Branch a [Tree a]

に対して

type Forest a = [Tree a]
instance TreeCon Forest where
     children (Forest tts@(t:_)) = case t of
                            Branch _ xs -> map (:tts) xs
                            Leaf _      -> []

とはできないんですねえ。

newtype Forest a = MkTreeList [Tree a]
instance TreeCon Forest where
     children (Forest tts@(t:_)) = case t of
                            Branch _ xs -> map (MkTreeList . (:tts)) xs
                            Leaf _      -> []

とすると大丈夫なようですが、まどろっこしい感じがします。
なにかいい解決策はないでしょうか。


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/