読者です 読者をやめる 読者になる 読者になる

再帰しながらyieldする方法

プログラム

再帰しながらyieldするには、どしたらよかんべか
2文木を左優先でじゅんぐりむっくりアクセスするには・・・
と思って書いてみた
なんとなく動いている

Public Overridable Iterator Function GetEnumerator() As IEnumerator(Of Node) Implements IEnumerable(Of Node).GetEnumerator

    Dim NodeSearch As Func(Of Node, IEnumerable(Of Node)) =
        Iterator Function(node As Node) As IEnumerable(Of Node)

            If node Is Nothing Then Return
            For Each x In NodeSearch(node.Left)

                Yield x
            Next
            Yield node
            For Each x In NodeSearch(node.Right)

                Yield x
            Next
        End Function

    For Each x In NodeSearch(Me.root_)

        Yield x
    Next
End Function

VBおかしいよ、C#もだけど
余計なことかかずにこんだけ文量がかかる
やっぱり無理にyieldなんて構文ついかせんで、イテレータのブロック引数にもらって関数適用させたら分かりよいのに

GetEnumerator :: (Node -> a) -> Node -> a
GetEnumerator f node =
    | node is null = ()
    | otherwise    = do
        GetEnumerator f node.Left ←このへん適当
        f node
        GetEnumerator f node.Right

ちょっと構文知らないけどこんな感じだろうか

def GetEnumerator(proc, node)
    if node が nil なら return
    
    GetEnumerator(proc, node.Left)
    proc(node)
    GetEnumerator(proc, node.Right)
end

よっぽど分かりよいわ