data Item = Person String Int String | Car String Bool
在Python3.6中编写
def g(x):
tag, *values = x
if tag == 'Person':
name, age, e_mail_address = values
# do something
pass
elif tag == 'Car':
brand, is_diesel = values
# do something
pass
else:
raise TypeError
在Haskell中,它也被称为“sum类型”。
另一种选择是使用类。使事情更清楚。例如Haskell的Either
data Either a b = Left a | Right b
在Python中,它将类似于
class Either:
def __init__(self, a=None, b=None):
if (a is None) and (b is not None):
self._left = None
self._right = float(b)
elif (a is not None) and (b is None):
self._left = int(a)
self._right = None
else:
raise TypeError
@property
def is_left(self):
return self._left is not None
@property
def is_right(self):
return self._right is not None
@property
def value(self):
if self.is_left:
return self._left
elif self.is_right:
return self._right
def __eq__(self, other):
if isinstance(other, Either):
if self.is_left == other.is_left:
return self.value == other.value
else:
return False
else:
raise TypeError
def __str__(self):
return str(self.value)
Macropy提供代数数据类型、模式匹配等!
下面是一个相对Pythonic方式的sum类型的实现。
打开一个翻译,你会看到熟悉的行为:
注意:
@attr.s
decorator来自attrs library,它实现__init__
、__repr__
和__eq__
,但它也冻结对象。我加入它是因为它减少了实现的规模,但它也广泛可用,而且相当稳定。求和类型有时称为标记联合。在这里,我使用了
kind
成员来实现标记。附加的每变量参数通过列表实现。在真正的Pythonic方式中,这是在输入和输出端输入的duck类型,但没有在内部严格执行。我还包含了一个
match
函数,它执行基本模式匹配。类型安全也通过duck类型实现,如果传递的lambda函数签名与您试图匹配的实际变量不一致,则会引发TypeError
。这些求和类型可以与产品类型(
list
或tuple
)组合,并且仍然保留代数数据类型所需的许多关键功能。问题
这并不严格限制变量集。
在Python中,变量已经可以有多个实例(当然不能同时)。
例如,在代码中可以执行以下操作:
如果你想靠近哈斯克尔,你可以这样做。用哈斯克尔语说
在Python3.6中编写
在Haskell中,它也被称为“sum类型”。
另一种选择是使用类。使事情更清楚。例如Haskell的
Either
在Python中,它将类似于
相关问题 更多 >
编程相关推荐