0

一部のデータを取り込んで値の配列を返す関数があります。データのリストをツリーにマップする必要があります。

ツリーを作成すると、関数の呼び出しごとに次の 3 つのパラメーターが必要になります。

  • 文字列の文字
  • 文字列からの文字のインデックス
  • ノードの親の関数の出力の一部 (またはルートのゼロ)

議論のために、私が持っているとしましょう:

input = "ABC"

func :: (Char, Int, Int) -> [(Char, Int, Int)]
func ('A', 1,    0) = [('Q', 1, 1243)]
func ('B', 2, 1243) = [('D', 2, 7512), ('R', 2, 8253)] -- 1243 taken from above
func ('C', 3, 7512) = [('E', 3, 2765)]
func ('C', 3, 8253) = [('Z', 3, 9836)]

次のようなツリーにマップされます。

    ('Q', 1243)
     /       \
('D',7512)  ('R',8253)
    |         |
('E',2765)  ('Z',9836)

最初の 2 つのパラメーターは問題ありません。リストを作成する前に取得できます。

input `zip` [1..]

ただし、ツリーの構築を開始する前にルート ノードの値 (ゼロになる) しか知らないため、3 番目のパラメーターを取得する方法がわかりません。モナドについて学ぶ必要がありますか?

注: 私は、Haskell と関数型プログラミング全般についてまったくの初心者です。

4

1 に答える 1

1

このようなものはあなたが求めているものですか?

import Data.Tree

buildForest :: String ->
               ((Char, Int, Int) -> [(Char, Int, Int)]) ->
               Forest (Char, Int)
buildForest input children = go input 1 0
    where
        go []     _ _ = []
        go (x:xs) i n = map transform (children (x,i,n))
            where
                transform (y,_,n') = Node (y,n') (go xs (i+1) n')

次に、あなたの例では、それをのように呼びますbuildForest "ABC" func

(コードはテストされていませんが、間違っている場合でも、一般的なアプローチを使用できるはずです。)

于 2013-02-10T01:17:14.390 に答える