Haskell 多重リスト

この言葉が 廣く使はれてゐるのかは知らない
多次元リスト といふ言葉も ネットに載ってゐる
リストの中に リストがある といった意味合ひで使はれるのだらうとは思ふ
例へば
[[1,2],[1,2,3],[4],[6,5,4,3]]
といったものだらう
だが 私としては 「多重リスト」といふ言葉を
「リストの中に 「リストのリスト」も 「リストのリストのリスト」も含むやうなリスト」
の意味で使ひたい
いや 既にそれを表す用語があるのなら それを使ふのだが 今私はそれを知らないから

つまり 多重リスト といふのは 私にとって
[1, [2,3], [3,[4,5]], [[[6,7],[8]]]]
のやうに書けるやうなものだ
多分 Haskell では かういうのは リストと言はないだらうが

これは おそらく 構造としては 「木」の構造だから 「木」と呼ぶべきなのだらう
けれども 上の表記は それなりに データの構造が分かりやすく可視化できてゐると思ふ
Data.Tree モジュールを利用して この構造を實装し 可視化しやうとしたのが 私のつくった MyTreeモジュールだ

github.com

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]]]" となる