如何理解这个Elm函数

问题描述 投票:0回答:1

我一直在尝试理解以下函数,但我认为我对它的解释不正确。 我正在尝试将其转换为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                        

注意您要检查类型而不是检查完全相同的对象。

python-3.x elm
1个回答
3
投票

您正在查看一个标记联合以及与该标记联合的简单模式匹配。

type UITreeNodeChild = UITreeNodeChild UITreeNode
中,右侧的
UITreeNodeChild
是标签。
UITreeNode
是标记的数据类型。

当你说:

case child of
    UITreeNodeChild node ->
        node

您正在将

child
与以
UITreeNodeChild
开头的模式进行模式匹配。标记的数据类型值绑定到名称
node
,这也是从该模式匹配的 case 表达式返回的值。

由于这个标记的联合只有一种变体,您还可以选择在参数声明中将其解压:

unwrapUITreeNodeChild : UITreeNodeChild -> UITreeNode
unwrapUITreeNodeChild (UITreeNodeChild node) =
     node

在 python 中执行此操作的方式取决于您选择实现标记联合的方式。一般方法是一样的。你必须有某种类型的标签,并且必须有一种方法来确定值的标签。然后,您可以根据标记返回嵌入的数据类型。使用单个标签,这只是返回嵌入的数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.