scala – 解释免费monad列表与解释列表中的免费monad
我正在学习函数式编程,并且有一些(可能很明显,但不适合我:))关于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))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |