Fsharp /(string * FsTree)リストのタイプノードを2つのパスを同一にできないリストに変更する方法

テディトレゾール瞑想

FSharpでは、次のことを行いたいと思います

与えられたタイプ: type FsTree = Node of (string * FsTree) list

述語toStringListを定義して、:toStringList myFsTreeが次の結果を与えるようにします。

結果:

[
    ["n1"];
    ["n2"; "sub_n2_1"];
    ["n2"; "sub_n2_2"];
    ["n3"; "sub_n3"; "sub_sub_n3_1"];
    ["n3"; "sub_n3"; "sub_sub_n3_2"];
    ["n3"; "sub_n3"; "sub_sub_n3_3"];
    ["n4"];
]

どこ

let myFsT = Node [
    ("n1", Node []); 
    ("n2", Node [
    ("sub_n2_1", Node []);
    ("sub_n2_2", Node [])
    ]); 
    ("n3", Node [
    ("sub_n3", Node [
    ("sub_sub_n3_1", Node []); 
    ("sub_sub_n3_2", Node []); 
    ("sub_sub_n3_3", Node []); 
    ])
    ]); 
    ("n4", Node [])
]

私がこれまでに行ったこと(ここでは以下)は絶対に正しくありません、私はそれを知っています。しかし、私は本当にここで立ち往生しています!誰かが何をすべきか考えていますか?

let rec test (fst:FsTree) = 
        match fst with
        | Node []              -> []
        | Node ((str, subFst)::restNode) -> 
            [[str] @ (test subFst)] @ (test restNode)
AMieres

これは、Node内のリストと内のリスト用の2つの相互再帰関数を必要とするため、注意が必要Nodeです。

let rec processNode     prepend node =
    let rec processList prepend listOfNodes =
        match   listOfNodes with
        | []                         -> []
        | (str, subNode) :: restList -> 
            let restList = processList  prepend restList
            let newPrepend = List.append prepend [ str ]
            match processNode newPrepend subNode with
            | []  -> [ newPrepend ]
            | lst -> lst
            @ restList
    match node with Node listOfNodes -> processList prepend listOfNodes

processNode [] myFsT
|> List.iter print

リスト内の要素を調べるには、1つの再帰関数が必要です。 processList

もう1つは、リスト内のサブノードを調べますprocessNode

混乱が生じるのprocessNodeは、リストを取得してからNode呼び出すだけなprocessListので、1つの関数であるかのように簡単に考えることができます。

OTOHprocessListは二重再帰法です。リストの要素を調べるために自分自身を呼び出しprocessNode、サブツリーをさらに深く調べるために呼び出します

prependパスを運ぶアキュムレータパラメータも渡す必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

FSharp.Core.StringのconcatとSystem.StringのConcat

分類Dev

リストタイプに一致するFSharpパターン

分類Dev

Fsharp F#でバイナリツリーを再帰的にトラバースする3つの方法

分類Dev

fsharpの型に追加する

分類Dev

オブジェクトをFSharpリストにキャストする方法

分類Dev

リストビューのバインド中にタイプ「string」を「bool」に変換できません

分類Dev

FSharp.Data.SqlProviderが遅い

分類Dev

XUnit2.0およびFSharpスタイルのテストで出力をキャプチャする方法

分類Dev

fsharpでポイントをラインに変換する

分類Dev

NSubstituteとFSharp-FSharp関数のモック

分類Dev

4.6.1 FileNotFoundExceptionをスローするF#アプリ:FSharp.Core

分類Dev

Linuxでfsharpでnugetを使用する方法

分類Dev

const std :: string&をコンストラクターに渡すと、初期化子リストのconst std :: string&メンバー変数にバインドできないのはなぜですか?

分類Dev

VisualStudioでエラースクイッゲルがある場合にタイプ情報を表示する方法[fsharp]

分類Dev

FSharp.Dataパッケージを参照するときに、LINQPadでFSharp.Coreを参照できません

分類Dev

FSharpのTask.FromResult(0)を使用する

分類Dev

List <string>を作成せずに画像ソースをパスのリストにバインドするにはどうすればよいですか?

分類Dev

Fsharp:関数にN個のパラメーターを渡す

分類Dev

FsharpのカスタムタイプをJSON文字列に変換するにはどうすればよいですか?

分類Dev

FSharpで2つの配列の違いを見つける

分類Dev

DoubleのリストをStringのリストに変換する方法は?

分類Dev

module.exportsがStringオブジェクトとモジュールインスタンスを保持できるのに、Stringリテラルとモジュールインスタンスは保持できないのはなぜですか?

分類Dev

JavaストリームでList <Map <String、Object >>をList <String>に変換して各ストリームの一部を削除する方法

分類Dev

FSharp.Core.optdataがFSharp.Coreと一緒に見つかりません

分類Dev

fsharpはリストからn番目の要素を取得します

分類Dev

タグ付きのイメージ名のdockerレジストリapiにmap [string] [] stringを作成するにはどうすればよいですか?

分類Dev

onClick リスナーは関数であると想定されていましたが、代わりにタイプ string 不明なイベント ハンドラー プロパティ onclick を取得しました。「onClick」のことですか?

分類Dev

Fsharpにチャートを表示させる方法は?

分類Dev

FSharpでネストされたJSONオブジェクトを作成する方法

Related 関連記事

  1. 1

    FSharp.Core.StringのconcatとSystem.StringのConcat

  2. 2

    リストタイプに一致するFSharpパターン

  3. 3

    Fsharp F#でバイナリツリーを再帰的にトラバースする3つの方法

  4. 4

    fsharpの型に追加する

  5. 5

    オブジェクトをFSharpリストにキャストする方法

  6. 6

    リストビューのバインド中にタイプ「string」を「bool」に変換できません

  7. 7

    FSharp.Data.SqlProviderが遅い

  8. 8

    XUnit2.0およびFSharpスタイルのテストで出力をキャプチャする方法

  9. 9

    fsharpでポイントをラインに変換する

  10. 10

    NSubstituteとFSharp-FSharp関数のモック

  11. 11

    4.6.1 FileNotFoundExceptionをスローするF#アプリ:FSharp.Core

  12. 12

    Linuxでfsharpでnugetを使用する方法

  13. 13

    const std :: string&をコンストラクターに渡すと、初期化子リストのconst std :: string&メンバー変数にバインドできないのはなぜですか?

  14. 14

    VisualStudioでエラースクイッゲルがある場合にタイプ情報を表示する方法[fsharp]

  15. 15

    FSharp.Dataパッケージを参照するときに、LINQPadでFSharp.Coreを参照できません

  16. 16

    FSharpのTask.FromResult(0)を使用する

  17. 17

    List <string>を作成せずに画像ソースをパスのリストにバインドするにはどうすればよいですか?

  18. 18

    Fsharp:関数にN個のパラメーターを渡す

  19. 19

    FsharpのカスタムタイプをJSON文字列に変換するにはどうすればよいですか?

  20. 20

    FSharpで2つの配列の違いを見つける

  21. 21

    DoubleのリストをStringのリストに変換する方法は?

  22. 22

    module.exportsがStringオブジェクトとモジュールインスタンスを保持できるのに、Stringリテラルとモジュールインスタンスは保持できないのはなぜですか?

  23. 23

    JavaストリームでList <Map <String、Object >>をList <String>に変換して各ストリームの一部を削除する方法

  24. 24

    FSharp.Core.optdataがFSharp.Coreと一緒に見つかりません

  25. 25

    fsharpはリストからn番目の要素を取得します

  26. 26

    タグ付きのイメージ名のdockerレジストリapiにmap [string] [] stringを作成するにはどうすればよいですか?

  27. 27

    onClick リスナーは関数であると想定されていましたが、代わりにタイプ string 不明なイベント ハンドラー プロパティ onclick を取得しました。「onClick」のことですか?

  28. 28

    Fsharpにチャートを表示させる方法は?

  29. 29

    FSharpでネストされたJSONオブジェクトを作成する方法

ホットタグ

アーカイブ