типы данных функционального стиля в Python - PullRequest
3 голосов
/ 09 апреля 2010

Для тех, кто провел некоторое время с 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 ]

1 голос
/ 09 апреля 2010

Для простых перечислений, таких как voice, place и manner, вы можете использовать такой класс:

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 голос
/ 09 апреля 2010

Как указано, ваш тип голоса, места и манеры являются просто перечисляемыми типами. Существует несколько способов их реализации, например

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

Тогда вы можете обратиться к голосу. Голосу и голосу. Без голоса и т. Д.

Проблема в таких типах, как фонема. В С обычным способом реализовать нечто подобное было бы держать нос и использовать союз. В чем-то вроде 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 голосов
/ 09 апреля 2010

Вы можете создавать классы, содержащие нужные вам атрибуты.

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')
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...