Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python monad能做这个OOP所能做的吗';T_Python_Oop_Monads - Fatal编程技术网

Python monad能做这个OOP所能做的吗';T

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

为了理解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):
        return Error()


a = Some(1)
b = a.apply(lambda x:Some(x+5))
你能举一个monad解决方案的例子吗,它不能转换成这样的OOP代码


(你认为面向对象语言中用于数据转换的单子有用吗?

这里有一篇文章讨论了使用Swift作为语言的单子,这可能会帮助你更好地理解它们:

基本点是单子是一个有三个组件的对象

  • 一个构造函数,它可以接受其他对象,并创建一个包装该对象的单子
  • 一种方法,可以将一个对单子一无所知的函数应用于其内容,并返回封装在单子中的结果
  • 一种方法,可以应用一个函数,该函数接受原始对象并返回封装在monad中的结果,然后返回该monad
  • 请注意,这意味着,如果语言将方法视为第一类对象,并且存在必要的方法,那么即使是数组类也可以是monad


    如果该语言不将方法视为第一类对象,即使它是一种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来进行数据转换?