Python中的函数式数据类型 [英] functional-style datatypes in Python

查看:128
本文介绍了Python中的函数式数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于那些花了一些时间与sml,ocaml,haskell等的人,当你回到使用C,Python,Java等时,你开始注意到你从未知道的东西丢失了。我正在做一些Python中的东西,我意识到我真正想要的是一种功能样式的数据类型,例如(/)数据类型phoneme =字符串的元音|语音辅音*地点*方式
datatype voice =有声| |无声
datatype place = Labial |牙科| Retroflex | Palatal | Velar | Glottal
datatype manner = Stop | Affricate |擦音| |鼻| |横向
型音节=音素清单

有没有人有他们喜欢模拟的特定方式这在Python中?

解决方案

正如所指出的,您的语音,地点和方式类型只是枚举类型。有很多方法可以实现这些功能,如

  class voice(object):
浊音,无声音=范围(2)

然后你可以参考voice.Voiced和voice.Voiceless,等等。

问题是音素类型。在C中,通常的实现这种方式的方式是捏住你的鼻子并使用联合。在像Python这样的东西,你使用多态。首先,找出你要在音素类型上执行的操作。然后,将这些操作作为Vowel类和Consonant类的成员函数来实现。在C ++中,你会使这些成员函数变为虚拟的,并为Vowel和Consonant创建一个抽象基类;在python中,你可以不用这样做而感谢鸭子打字,尽管你仍然可以找到一个基类是有用的。

所以,

  class元音(object):
def SomeInitialMethod(self):
#...

class辅音(宾语):
def SomeInitialMethod(self):
#...

p.SomeInitialMethod()#p可以是元音或辅音

def SomeLaterFunction(p)
#p被假定为元音或辅音
如果isinstance(p,元音):
#...
elif isinstance( p,辅音):
#...


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 some stuff in Python and I realized what I really want is a functional-style datatype like (for example)

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

Does anyone have a particular way that they like to simulate this in Python?

解决方案

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

class voice(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,

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

这篇关于Python中的函数式数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆