加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – List如何成为monad?

发布时间:2020-12-16 18:25:11 所属栏目:安全 来源:网络整理
导读:我认为我对Monads和monadic操作有一个基本的把握,但仍然有点停留在理解monadic类型的神奇特征如何被添加到底层类型(希望这是有道理的). 例如,关于List [T]是monad的I was reading.但是,如果我为了理解而逐行地映射并映射一些列表,那么它是不是真的是flatMap
我认为我对Monads和monadic操作有一个基本的把握,但仍然有点停留在理解monadic类型的神奇特征如何被添加到底层类型(希望这是有道理的).

例如,关于List [T]是monad的I was reading.但是,如果我为了理解而逐行地映射并映射一些列表,那么它是不是真的是flatMap和地图提供了monadic魔法?

如果我创建一个List< String>那么monadic魔法是如何加入的呢?或者是列表< T>始终是Scala中的monad,因为它恰好是该语言已经提供内置monadic支持的容器之一?

解决方法

你是完全正确的flatMap和地图提供“monadic魔术”.幸运或遗憾的是(取决于你看到多少糟糕的代码)编程没有魔力.没有任何抽象可以帮助您(或其他人)最终编写完成所需事物的代码.抽象“只是”让您重复使用以前编写的代码并澄清您对问题的想法. monad然后只是一个概念,一个想法,一个抽象等.

在Scala的情况下,这实际上是编译器对于理解所做的事情,它变成了一系列flatMap,map,withFilter和filter语句.

monad(在Scala中)可以被认为只是你碰巧有一个类型构造函数T [_]和两个函数1的现象的标签

def f0[A](x: T[A],f: X => T[A]): T[A]
def f1[A](x: A): T[A]

按照惯例,当他们看到这种现象时,Scala社区调用f0 flatMap并且通常使它成为一个方法,以便x始终是父类而不是单独的参数.还有一个惯例叫f1点或纯(见scalaz或猫). f1通常也是一种方法,因此它不会以显式方式接受参数,只使用其父类作为x.

每当有人说“这样的”是monad时,总会有一个隐含的f0和f1,说话者希望听众推断出来.严格来说,“List is a monad”是一种轻度滥用的术语.这是List的简写以及函数(xs:List [A],f:A => List [A])=> xs.map(f).flatten(形成f0)和(x:A)=> List(x)(形成f1)形成monad.或者稍微迟钝,List和列表上的标准flatMap以及List.apply构造函数形成一个monad.

因此,从来没有任何魔法.作为Monad分类的一部分,你必须提供flatMap和pure的概念.

有很多方法可以将monad的抽象转换为代码.天真的方式(即没有第三方库的Scala)只是就f0和f1的公共名称(例如flatMap)达成一致,并且只是将具有相应类型签名的方法命名为这些名称.这基本上是scalac期望你为理解做的事情.你可以更进一步,尝试用特征或抽象类来形式化.也许称它为Monad是可爱的,并具有以下内容:

trait Monad[A] {
  def flatMap(f: A => Monad[A]): Monad[A]

  def pure(x: A): Monad[A]
}

然后你可以调用任何扩展这个Monad的东西来实现monad的想法(你可能会想象类List [A]扩展Monad [A]).

出于各种实际原因,这种结果并不令人满意,因此您最终得到了通常的解决方案(看起来像是手上挥舞着许多其他复杂性)

trait Monad[F[_]] {
  def flatMap[A](f: A => F[A]): F[A]

  def pure[A](x: A): F[A]
}

由implicits实现.

脚注:

>以及一些管理其互动的法律/惯例.存在这些法律的实际原因是为程序员的生活提供理智,这样他们就知道当有人告诉他们这些功能是“一元的”时会发生什么.这些定律恰恰是对诸如monad这样的结构的推理如此有用的原因,但我不会在这里深入研究它们,因为它们在其他地方得到了充分的解释.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读