我是 F# 新手,正在学习基础知识。
我有两个模块。一种用于树数据结构的通用结构,称为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
参数,该参数是一个枚举给定类型节点的子节点的函数。
第二个模块处理 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
getXmlChildren
为 XML 节点定义了一个特定的函数并将其传递给 curriedTree
函数。
现在有大量的代码重复。
有没有可能做以下事情?(伪代码)
module XmlTree = Tree with getChildren = fun (node : XElement) -> node.Elements()