1

データを便利に分析するために、次のコード用のライブラリを使用したいと思います。

data SomeType = A [String] Int | B | C Int deriving (Eq, Ord, Show)

main = do 
  let theData = A ["a", "b", "c"] 9 : C 3 : B : []
  putStr $ treeString theData -- `treeString` is the implied library function

次のような出力が生成されます。

- A:
| - - a
| | - b
| | - c
| - 9
- C:
| - 3
- B

そのような図書館はありますか?それとも、そのような問題に対するより良いアプローチでしょうか?

4

2 に答える 2

4

Data.TreedrawTreeとは似たような形式の関数を持ってdrawForestいるため、データ構造を に変換する関数を記述してからTree Stringを使用できますdrawTree

import Data.Tree

data SomeType = A [String] Int | B | C Int deriving (Eq, Ord, Show)

toTree :: SomeType -> Tree String
toTree (A xs n) = Node "A" [Node "*" (map (flip Node []) xs), Node (show n) []]
toTree B        = Node "B" []
toTree (C n)    = Node "C" [Node (show n) []]

main = do 
  let theData = A ["a", "b", "c"] 9 : C 3 : B : []
  putStr $ drawTree (Node "*" (map toTree theData))

出力:

*
|
+- A
|  |
|  +- *
|  |  |
|  |  +- a
|  |  |
|  |  +- b
|  |  |
|  |  `- c
|  |
|  `- 9
|
+- C
|  |
|  `- 3
|
`- B
于 2012-11-19T13:59:02.103 に答える
1

ハンマーの答えに追加します。への一般的な変換を行う方法は次のData.Treeとおりです。

import Data.Tree
import Data.Generics
import Control.Applicative

dataTree = fix . genericTree
  where
    genericTree :: Data a => a -> Tree String
    genericTree = dflt `extQ` string
      where
        string x = Node x []
        dflt a = Node (showConstr (toConstr a)) (gmapQ genericTree a)
    fix (Node name forest)
      | name == "(:)" 
      , a : b : [] <- forest
        = Node "*" $ (fix a) : (subForest $ fix b)
      | otherwise = Node name $ fix <$> forest

しかし、これが自分のデータ型で機能するには、 のインスタンスが必要です。これは、プラグマを追加して型を次のように派生させるDataことで簡単に実現できます。{-# LANGUAGE DeriveDataTypeable #-}TypeableData

data SomeType = A [String] Int | B | C Int | D [[String]] 
  deriving (Typeable, Data)
于 2012-11-20T15:17:15.720 に答える