2010-04-09 17 views
3

對於任何花時間回顧使用C,Python,Java等的時間與sml,ocaml,haskell等的人,您都會注意到您從未知道的事情不見了。我在做Python中的一些東西,我意識到我真正想要的是一個函數式數據類型等(例如)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來模擬這種特定的方式?

+0

你能解釋發生了什麼對我們的功能newbs?我的第一個猜測是列表解析與多個'for',但... – 2010-04-09 02:03:40

+0

在創建自己的類型類並覆蓋位運算符和乘法運算符後,基本上會有這樣的事情。 但是......如果這真的很實用? ;) 如果你想要一個函數式編程語言......使用一種函數式編程語言。雖然Python會允許你做這樣的事情,但它總是次優。 – Wolph 2010-04-09 02:06:43

回答

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

請注意,最好始終繼承'object'而不是無('class Phoneme(object)'),以便使用新風格的類。 – 2010-04-09 04:02:15

+0

默認情況下,新式類仍不會被繼承? – 2010-04-09 18:44:59

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 
+0

我不清楚這個解決方案是如何值得的。你能幫我理解嗎? – 2010-04-09 04:00:47