Python monad能做这个OOP所能做的吗';T
为了理解monad,并想知道它们是否对Python中的数据转换编程有用,我看了很多介绍性的解释。但我不明白为什么单子很重要 下面的Python代码是monad的良好表示吗Python monad能做这个OOP所能做的吗';T,python,oop,monads,Python,Oop,Monads,为了理解monad,并想知道它们是否对Python中的数据转换编程有用,我看了很多介绍性的解释。但我不明白为什么单子很重要 下面的Python代码是monad的良好表示吗 class Some: def __init__(self, val): self.val=val def apply(self, func): return func(self.val) class Error: def apply(self, func):
class Some:
def __init__(self, val):
self.val=val
def apply(self, func):
return func(self.val)
class Error:
def apply(self, func):
return Error()
a = Some(1)
b = a.apply(lambda x:Some(x+5))
你能举一个monad解决方案的例子吗,它不能转换成这样的OOP代码
(你认为面向对象语言中用于数据转换的单子有用吗?这里有一篇文章讨论了使用Swift作为语言的单子,这可能会帮助你更好地理解它们: 基本点是单子是一个有三个组件的对象
如果该语言不将方法视为第一类对象,即使它是一种OO语言,也无法实现Monad。我认为您的困惑可能是因为您正在使用一种多范式语言(Python),并假设它是一种纯OO语言。您编写的
apply
对应于名为bind
的monad函数
考虑到构造函数Some
(对于广义monad称为unit
或return
),您可以定义提升其他类型函数的函数fmap
和apply
:其中bind
提升并使用获取普通数据并返回monad的函数,fmap
对从普通数据到普通数据的函数执行此操作,apply
对包装在monad中的函数执行此操作
我认为,定义最后一个一元操作时会出现问题:join
join
获取嵌套的monad并将其展平到单个层。因此,这个方法不能用于类的所有对象,只能用于具有特定结构的对象。虽然如果您改为定义bind
可以避免join
(您可以根据bind
和标识函数编写join
),但对于像monad这样的数组,定义bind
很不方便。数组上的函数更自然地用fmap
(循环数组并应用函数)和join
(取一个嵌套数组并展平它)来描述
我认为,如果你能应对这些挑战,你可以用你选择的任何语言实现monad。我确实认为单子在许多语言中都很有用,因为许多子计算都可以用它们来描述。它们代表了许多常见问题的已知解决方案,如果您已经可以使用它们,这意味着您不必测试或调试代码;它们是已经起作用的工具
自己实现它们可以让您使用功能性文献和思维方式来解决问题。这种便利性是否值得实现取决于您。monad用于函数式编程,在许多情况下用于表示某种序列。您所拥有的并不等同于monad解决方案。在monad解决方案中,apply中的func参数不必返回monad对象。@DanielT。。我想我看到了两个版本。我可以改变它,但问题仍然是单子还有更多的地方。正如你从我下面的回答中看到的,不是真的。在Haskell中引入monad的原因是为了强制方法按程序员定义的顺序执行(在Haskell中,通常由编译器决定函数的执行顺序)。在其他语言中,monad更像是一种适配器。单子不是火箭科学,即使是,火箭科学也不是那么难。:-)@DanielT:那么Monad解决了一个OO语言没有的问题?鉴于上述OO解决方案在Python中是自然的,我不需要学习Monad来进行数据转换?