scala – List如何成为monad?
我认为我对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这样的结构的推理如此有用的原因,但我不会在这里深入研究它们,因为它们在其他地方得到了充分的解释. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |