<p>在Python中,变量已经可以有多个实例(当然不能同时)。</p>
<pre><code>>>> x = 5
>>> type(x)
<type 'int'>
>>> x = ["you", "me", "them"]
>>> type(x)
<type 'list'>
</code></pre>
<p>例如,在代码中可以执行以下操作:</p>
<pre><code>def f(x):
if isinstance(x, int):
pass
elif isinstance(x, float):
pass
else:
raise TypeError
</code></pre>
<p>如果你想靠近哈斯克尔,你可以这样做。用哈斯克尔语说</p>
<pre><code>data Item = Person String Int String | Car String Bool
</code></pre>
<p>在Python3.6中编写</p>
<pre><code>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
</code></pre>
<p>在Haskell中,它也被称为“sum类型”。</p>
<p>另一种选择是使用类。使事情更清楚。例如Haskell的<code>Either</code></p>
<pre><code>data Either a b = Left a | Right b
</code></pre>
<p>在Python中,它将类似于</p>
<pre><code>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)
</code></pre>