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

scala – 解释免费monad列表与解释列表中的免费monad

发布时间:2020-12-16 08:52:10 所属栏目:安全 来源:网络整理
导读:我正在学习函数式编程,并且有一些(可能很明显,但不适合我:))关于monad的问题.每个monad都是一个应用函子.应用仿函数依次可以定义为高级类型(纯方法省略): trait ApplicativeFunctor[F[_]]{ def ap[A](fa: F[A])(f: F[A = B]): F[B]} 据我所知,这个类型类意
我正在学习函数式编程,并且有一些(可能很明显,但不适合我:))关于monad的问题.每个monad都是一个应用函子.应用仿函数依次可以定义为高级类型(纯方法省略):

trait ApplicativeFunctor[F[_]]{
   def ap[A](fa: F[A])(f: F[A => B]): F[B]
}

据我所知,这个类型类意味着我们可以取两个F [A],F [B]和一个函数(A,B)=>的值. C并构建F [C].

此属性使我们能够构建列表反转功能:

def reverseApList[F[_]: ApplicativeFunctor,A](lst: List[F[A]]): F[List[A]]

我们拥有

trait SomeType[A]

现在考虑

type MyFree[A] = Free[SomeType,A] 
val nt: NaturalTransformation[SomeType,Id]
val lst: List[MyFree[Int]]

问题:为什么lst.map(_.foldMap(nt))和reverseApList(lst).foldMap(nt)相同?是应用仿函数法还是有其他原因?你能解释一下吗?

解决方法

它遵循Traversable运算符的定律.

首先,要意识到_.foldMap(nt)本身就是从MyFree到Id的自然转换.而且,通过对自由monad的意义的定义,它必须是monad homomorphism1(对于任何nt).

让我们从你的开始

reverseApList(lst).foldMap(nt)

也可以写成

lst.sequence.foldMap(nt)

现在我们将应用naturality law of Traversable functors,其中_.foldMap(nt)作为自然变换nat.为了适用它,我们的自然变换必须是一个适用的同态,由the two extra conditions表示.但我们已经知道我们的自然变换是一个monad同态,它比应用同态更强(保留更多的结构).因此,我们可以继续适用这项法律并获得

lst.map(_.foldMap(nt)).sequence : Id[List[Int]]

现在只使用链接的scalaz文件中的定律,可证明(尽管以迂回的方式),通过Id的最后一个序列实际上是无操作.我们明白了

lst.map(_.foldMap(nt))          : List[Id[Int]]

这是我们想要展示的.

1:自然转化h:M – >如果它保持单一结构,即如果它满足,则N是单子同态

>对于任何a:A:h(Monad [M] .point [A](a))= Monad [N] .point [A](a)>对于任何ma:M [A]和f:A => M [B]:h(ma.flatMap(f))= h(ma).flatMap(a => h(f(a)))

(编辑:李大同)

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

    推荐文章
      热点阅读