簡體   English   中英

Python中的函數式數據類型

[英]functional-style datatypes in 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中模擬這個?

對於像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 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):
    # ...

您可以創建包含所需屬性的類。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM