Python中的函数式数据类型

时间:2010-04-09 01:58:44

标签: python types functional-programming

对于那些花了一些时间用sml,ocaml,haskell等等的人,当你回到使用C,Python,Java等时,你会开始注意到你从未知道的东西丢失了。我正在用Python做一些事情,我意识到我真正想要的是一个功能样式的数据类型,例如(例如)

datatype phoneme = Vowel of string | Consonant of voice * place * manner
datatype voice = Voiced | Voiceless
datatype place = Labial | Dental | Retroflex | Palatal | Velar | Glottal
datatype manner = Stop | Affricate | Fricative | Nasal | Lateral
type syllable = phoneme list

有没有人有一种特殊的方式,他们喜欢在Python中模拟这个?

3 个答案:

答案 0 :(得分:1)

对于voiceplacemanner之类的简单枚举,您可以使用这样的类:

class Enum(object):
   def __init__(self, *values):
      self._values = set(values)
      for value in values:
         setattr(self, value, value)
   def __iter__(self):
      return iter(self._values)

place = Enum('Labial', 'Dental', 'Retroflex', 'Palatal', 'Velar', 'Glottal')

a = place.Retroflex    
if a == place.Labial:
   print "How did this happen?"

for p in place:
   print "possible value:", p

答案 1 :(得分:1)

正如......所示,您的语音,地点和方式类型只是枚举类型。有很多方法可以实现这些,例如

class voice(object):
  Voiced, Voiceless = range(2)

然后你可以参考voice.Voiced和voice.Voiceless,等等。

问题是像音素这样的类型。在C中,实现类似的东西的通常方法是抓住你的鼻子并使用联合。像python这样的东西,你使用多态。首先,弄清楚您要对音素类型执行哪些操作。然后,将这些操作实现为Vowel类和Consonant类的成员函数。在C ++中,您可以将这些成员函数设置为虚拟,并为Vowel和Consonant创建一个抽象基类;在python中你可以通过鸭子打字而不用这样做而逃脱,尽管你仍然可以找到一个有用的基类。

所以,

class Vowel(object):
  def SomeInitialMethod(self):
    # ...

class Consonant(object):
  def SomeInitialMethod(self):
    # ...

p.SomeInitialMethod() # p can be either vowel or consonant

def SomeLaterFunction(p)
  # p is assumed to be either a Vowel or a Consonant
  if isinstance(p, Vowel):
    # ...
  elif isinstance(p, Consonant):
    # ...

答案 2 :(得分:0)

您可以创建包含所需属性的类。

class Phoneme:
    # ...

class Consonant(Phoneme):
    def __init__(self, voice, place, manner):
        self.voice = voice
        self.place = place
        self.manner = manner
    # ...

h = Consonant('Voiceless', 'Glottal', 'Fricative')
# ...