我一直在尝试理解以下函数,但我认为我对它的解释不正确。 我正在尝试将其转换为Python3:
type UITreeNodeChild
= UITreeNodeChild UITreeNode
unwrapUITreeNodeChild : UITreeNodeChild -> UITreeNode
unwrapUITreeNodeChild child =
case child of
UITreeNodeChild node ->
node
我看到底部有一个名为
unwrapUITreeNodeChild
的函数,它有一个名为 child 的参数,它是 UITreeNodeChild 的,并且该函数返回一个 UITreeNode。
在Python中我将其视为:
class UITreeNodeChild(Enum):
UITreeNodeChild=UITreeNode
def unwrapUITreeNodeChild(child: UITreeNodeChild) -> UITreeNode:
if child is UITreeNodeChild: #
pass # I have no idea what it really means.
我不明白函数签名的其余部分。 查看 ELM 文档后,我对 switch 感到困惑,但看起来它正在将节点传递到 UITreeNodeChild 的定义中。
我知道我错了。我错过了什么?
因此,它本质上是在示例中寻找类型检查,因此您要做的就是确认它是该类型,然后在底层代码中使用这个新属性。 它看起来有点类似于:
class UITreeNodeChild:
pass
def unwrapUITreeNodeChild(child: UITreeNodeChild) -> UITreeNode:
if type(child) == UITreeNodeChild:
pass
注意您要检查类型而不是检查完全相同的对象。
您正在查看一个标记联合以及与该标记联合的简单模式匹配。
在
type UITreeNodeChild = UITreeNodeChild UITreeNode
中,右侧的UITreeNodeChild
是标签。 UITreeNode
是标记的数据类型。
当你说:
case child of
UITreeNodeChild node ->
node
您正在将
child
与以 UITreeNodeChild
开头的模式进行模式匹配。标记的数据类型值绑定到名称 node
,这也是从该模式匹配的 case 表达式返回的值。
由于这个标记的联合只有一种变体,您还可以选择在参数声明中将其解压:
unwrapUITreeNodeChild : UITreeNodeChild -> UITreeNode
unwrapUITreeNodeChild (UITreeNodeChild node) =
node
在 python 中执行此操作的方式取决于您选择实现标记联合的方式。一般方法是一样的。你必须有某种类型的标签,并且必须有一种方法来确定值的标签。然后,您可以根据标记返回嵌入的数据类型。使用单个标签,这只是返回嵌入的数据类型。