私はF#を初めて使用し、基本を学びます。
2つのモジュールがあります。と呼ばれるツリーデータ構造の一般的なものTree
:
module Tree
let rec getDescendants getChildren node =
seq { yield node
for child in getChildren node do
yield! getDescendants getChildren child }
let isLeaf getChildren node = Seq.isEmpty (getChildren node)
let getLeaves getChildren node = getDescendants getChildren node
|> Seq.filter (isLeaf getChildren)
ご覧のとおり、すべての関数にはgetChildren
引数があります。これは、特定のタイプのノードの子を列挙する関数です。
2番目のモジュールは、XMLツリーのより具体的なケースを処理します。
module XmlTree
open System.Xml.Linq
let getXmlChildren (node : XElement) = node.Elements()
let getDescendants = Tree.getDescendants getXmlChildren
let getLeaves = Tree.getLeaves getXmlChildren
let isLeaf = Tree.isLeaf getXmlChildren
XMLノードの特定のgetXmlChildren
関数が定義され、カレー関数に渡されTree
ます。
現在、コードの重複が非常に多くなっています。
どういうわけか次のことを行うことは可能ですか?(擬似コード)
module XmlTree = Tree with getChildren = fun (node : XElement) -> node.Elements()