Python中的functionalstyle数据类型

2024-04-19 01:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

对于那些在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来模拟这个问题呢?在


Tags: of函数haskellplacejava事情数据类型voice
3条回答

对于像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

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

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')
# ...

如前所述,你的声音、地点和方式类型只是枚举类型。有许多方法可以实现这些功能,例如

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

那么你可以参考声音。声音以及声音。无声,等等。在

问题是音素之类的类型。在C语言中,实现这种功能的通常方法是按住鼻子并使用union。在python中,使用多态性。首先,弄清楚要对音素类型执行什么操作。然后,将这些操作作为元音类和辅音类的成员函数来实现。在C++中,你会让这些成员函数虚拟化,并为元音和辅音建立抽象基类;在Python中,由于鸭子打字,你可以不用这样做,尽管你可能仍然会找到一个有用的基类。在

所以

^{pr2}$

相关问题 更多 >