この言葉が 廣く使はれてゐるのかは知らない
多次元リスト といふ言葉も ネットに載ってゐる
リストの中に リストがある といった意味合ひで使はれるのだらうとは思ふ
例へば
[[1,2],[1,2,3],[4],[6,5,4,3]]
といったものだらう
だが 私としては 「多重リスト」といふ言葉を
「リストの中に 「リストのリスト」も 「リストのリストのリスト」も含むやうなリスト」
の意味で使ひたい
いや 既にそれを表す用語があるのなら それを使ふのだが 今私はそれを知らないから
つまり 多重リスト といふのは 私にとって
[1, [2,3], [3,[4,5]], [[[6,7],[8]]]]
のやうに書けるやうなものだ
多分 Haskell では かういうのは リストと言はないだらうが
これは おそらく 構造としては 「木」の構造だから 「木」と呼ぶべきなのだらう
けれども 上の表記は それなりに データの構造が分かりやすく可視化できてゐると思ふ
Data.Tree モジュールを利用して この構造を實装し 可視化しやうとしたのが 私のつくった MyTreeモジュールだ
module MyTree (Elm(..), showF, addElem) where import Data.Tree import Data.List (intercalate) data Elm a = El a Int Int showT :: Show a => Tree a -> String showT (Node x []) = show x showT (Node x tr) = "["++show x++", "++tail (showF tr) showF :: Show a => Forest a -> String showF [] = "" showF tr = "[" ++ intercalate ", " (map showT tr) ++ "]" addElem :: Elm a -> Forest a -> Forest a addElem (El mn _ _) [] = [Node mn []] addElem (El mn 0 0) fo = fo ++ [Node mn []] addElem (El mn l r) fo | lng > l && l > 0 = let (h,(Node s sf):t) = splitAt (lng - l) fo newNode = Node s (t++addElem (El mn l r) sf) in h ++ [newNode] | r > 0 = let (it,lt) = (init fo,last fo) Node x subf = lt -- last tree in if null subf then it ++ [lt, Node mn []] else it ++ [Node x (addElem (El mn l r) subf)] | otherwise = fo ++ [Node mn []] where lng = length fo
addElem といふのは リストに 新たな要素を加へやうとしてゐる
Tree a といふ型のリストが Forest a と呼ばれるものだ
Forest に要素を加へていき showF で その内容を リストっぽく見せやうとしてゐる
Elm といふ型は 加へたい要素の型と
「今まで加へた要素の 最後のいくつを 今回のものといっしょにまとめるか」
「次に加へる要素の いくつを 今回のものといっしょにまとめるか」
といふ3つの情報を指定して 要素を加へやうといふためのものだ
ちなみに最後の情報は 別のコードから呼び出すときに使ふためのもので 今回 ghciでは利用しない
かういふことをする場合 このやうな「木」のデータ構造にする意義があるのではないかと思ふ
たとはば このモジュールをghci で読みこんで
> a = addElem (El 1 0 0) [] > b = addElem (El 2 0 0) a > c = addElem (El 3 0 0) b > d = addElem (El 4 0 0) c > e = addElem (El 5 2 0) d > f = addElem (El 6 1 0) e
としたとき showF f
は
"[1, 2, [3, 4, [5, 6]]]"
となる