Skip to content Skip to sidebar Skip to footer

Functional-style Datatypes In Python

For anyone who's spent some time with sml, ocaml, haskell, etc. when you go back to using C, Python, Java, etc. you start to notice things you never knew were missing. I'm doing so

Solution 1:

As sth indicated, your voice, place, and manner types are just enumerated types. There are a number of ways to implement those, such as

classvoice(object):
  Voiced, Voiceless =range(2)

Then you can refer to voice.Voiced and voice.Voiceless, and so forth.

The problem is types like phoneme. In C the usual way to implement something like that would be to hold your nose and use a union. In something like python, you use polymorphism. First, figure out what operations you're going to perform on the phoneme type. Then, implement those operations as member functions of a Vowel class and a Consonant class. In C++ you'd make those member functions virtual and make an abstract base class for Vowel and Consonant; in python you can get away without doing that thanks to duck typing, although you might still find a base class to be useful.

So,

classVowel(object):
  defSomeInitialMethod(self):
    # ...classConsonant(object):
  defSomeInitialMethod(self):
    # ...

p.SomeInitialMethod() # p can be either vowel or consonantdefSomeLaterFunction(p)
  # p is assumed to be either a Vowel or a Consonantifisinstance(p, Vowel):
    # ...elifisinstance(p, Consonant):
    # ...

Solution 2:

For the simple enumerations like voice, place and manner you could use a class like this:

classEnum(object):
   def__init__(self, *values):
      self._values = set(values)
      for value in values:
         setattr(self, value, value)
   def__iter__(self):
      returniter(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

Solution 3:

You could create classes that contain the attributes you need.

classPhoneme:# ...classConsonant(Phoneme):def__init__(self, voice, place, manner):
        self.voice = voice
        self.place = place
        self.manner = manner
    # ...

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

Post a Comment for "Functional-style Datatypes In Python"