割り当てはツリーをミラーリングすることです(すべてのレベルで最も左の子が右端になります)。だから、ツリーのミラーリング
mirror :: Rose a -> Rose a
mirror (Node x []) = Node x []
mirror (Node x (y:ys)) = mirror (myReverse y)
--reverses given node children
myReverse :: Rose a -> Rose a
myReverse (Node x y) = Node x (reverse y)
私は一例で、このコードを実行します:
データ構造:
import Data.List
data Rose a = Node a [Rose a]
deriving (Eq, Show)
私がこれまでに出ているものを
Main> mirror (Node 1 [Node 11 [Node 111 [], Node 112[]], Node 12 [Node 121[]]])
関数は私にを返すは左端の葉にくっついていることを意味します。私のコードで判断すると、与えられたノードの子の子孫をy:ys
に渡していないので、論理的であるようです。どういうわけか、与えられたノードの最初の子のすべての子を逆転させることができなければならず、同じ関数の末尾にを渡す必要があります。どんなに頑張っても、私はこれを達成できず、論理的思考の限界にぶつかったように見えます。
Documentation for reverse function
ありがとうございました。組み込み関数 'map'を使用していただきありがとうございます。また、$記号はかっこを意味するのですか? $記号がなければ、スポイラの結果は 'mirror(Node a children)= Node a(逆(map mirror children))'でしょうか? –
@SYLARRR:はい、 '$ '演算子の優先順位は非常に低いので、通常はできるだけ右に伸びる大きな左括弧のように考えることができます。 – hammar
ヘイ、私はこのサイトで誰かがスポイラーを使うのを見たのは初めてです。よくやった。 –