0

私はユニプレートとSYBを使用しており、リストを変換しようとしています

例えば

    type Tree = [DataA]

data DataA =  DataA1 [DataB] 
            | DataA2 String 
            | DataA3 String [DataA]
               deriving Show

data DataB =  DataB1 [DataA] 
            | DataB2 String 
            | DataB3 String [DataB]
               deriving Show

たとえば、ツリーをトラバースして、すべての [DataB] に値を追加したいと思います。

だから私の最初の考えはこれを行うことでした:

changeDataB:: Tree -> Tree
changeDataB = everywhere(mkT changeDataB')
chanegDataB'::[DataB] -> [DataB]
changeDataB' <add changes here>

またはユニプレートを使用していた場合

    changeDataB:: Tree -> Tree 
    changeDataB = transformBi changeDataB'
    chanegDataB'::[DataB] -> [DataB]
    changeDataB' <add changes here>

問題は、完全なリストのみを検索したいということです。これらの検索のいずれかを実行すると、完全なリストとすべてのサブリスト (空のリストを含む) が検索されます。

もう 1 つの問題は、[DataB] の値が [DataB] を生成する可能性があることです。そのため、これが文字列内の文字を検索しないのと同じ種類の解決策であるかどうかはわかりません。

DataA1 と DataB3 でパターン マッチできましたが、実際のアプリケーションでは [DataB] がたくさんあります。親でのパターン マッチングは広範に行われます。

私が持っていたもう一つの考えは、

data DataBs = [DataB]

そしてそれを使って変身します。それはちょっと不自由に思えますが、もっと良い解決策があるはずです。

更新:これを行う必要がある主な理由は、

  1. [DataB]の順序を変更
  2. [DataB] に何かを追加

したがって、一致する mkT を作成するクールな方法をすべて知っている場合は、

B1:B2:B3:B4:[] ([DataB] の完全なリストと言えます)

そしてそうではない

B2:B3:B4:[]
またはその派生物。

私はただ弾丸を噛んで「DataBs」、データ型を作成し、それに対して単純なmkTマッチを行うことに賛成しています。

4

1 に答える 1

1

独自の変換関数を作成することになりました

そう

dataBListTrans:: ([DataB] -> [DataB]) -> Tree -> Tree
dataBListTrans f = transformBi $ dataAs f . (transformBi $ dataBs f)
 where
   dataAs f (DataA1 a bs) = DataA1 a (f bs)
   dataAs x = x
   dataBs f (DataB3 s bs) = DataB3 s (f bs)
   dataBs x = x

より大きなデータ構造を作成するのはちょっと面倒ですが、これは私が思いついた最高のものでした

于 2010-03-12T20:23:05.177 に答える