泛函编程(31)-泛函IO:Free Monad-Running free

  • 时间:
  • 浏览:0
  • 来源:神彩大发快3_彩神大发快3官方

亲戚朋友曾说不可能 另另一个 数据类型能有个Functor实例,越来越亲戚朋友就能够用它来产生另另一个 Free Monad。这个 要求从里面Free[F,A]类型里的map,flatMap能够了解:亲戚朋友用了implicit F: Functor[F]参数,不可能 能够有个Functor实例F能够实现map和flatMap。

foldMap通过调用resume引入了Trampoline运行机制。

在里面亲戚朋友有个Interpreter, foldMap:

Free[F,A]里的Functor F只接受另另一个 类型参数。StateF[S,A]有另另一个 类型参数,亲戚朋友能够用type lambda来处里类型参数匹配问題。

越来越 们就进入Interpreter来运算这段任务管理器吧。

希望通过哪此例子能把Free Monad的用途、用法、原理解释清楚了。

现在亲戚朋友不可能 得到了另另一个 FreeState Monad。下面接着实现FreeState的基础组件函数:

亲戚朋友得到了同样的运算结果。

看,把Interact升格后就能够使用for-comprehension了。

亲戚朋友能够用上一节的Interact类型:

Free类型的resume函数与Trampoline的基本一致,能够返回类型和增加了参数implicit F: Functor[F],不可能 Free[F,A]的F能够是个Functor:用Functor F能够产生Free[F,A]。

这个 运算土方法还是调用了resume函数。注意:Get(f) 返回 StateF[S,A],StateF是个Functor, F[Free[F,A]]越来越A就是 Free[F,A]

越来越 从文字意思上描述就清楚多了。如果 ,这个 stkprg到底是干哪此的?不可能 不从文字意义上解释亲戚朋友根本我沒有乎 这段任务管理器干了些哪此,为甚干的。换句直白搞笑的话就是 :越来越意义。这正是Free Monad功能精妙之处:亲戚朋友用Monad for-comprehension来编写一段Monadic program,如果 在Interpreter中赋予它具体意义:用Interpreter来确定任务管理器具体的意义。

亲戚朋友用另另一个 Stack操作的例子。对Stack中元素的操作包括:Push,Add,Sub,Mul,End。这几项操作也可被视作三种Stack编程语言中的各项操作指令:

从里面的Functor实例中亲戚朋友能够看到怎样才能通过map的f(n)来运行下一步骤next。

没错,这段任务管理器不但维护了另另一个 状态如果 使用了Trampoline运算模式,能够处里StackOverflow问題。

这另另一个 数据类型的设计目的删剪也有为了能逐步运行算法:按照算法运算的状态确定下一步该怎样才能运行。这个 F[Free[F,A]]就是 另另一个 循环递归形状,里面保存了运算当前状态和下一步运算。

下面亲戚朋友再用另另一个 例子来示范Free Monad的Monadic Program和Interpreter各自 的用途:

有了Functor实例亲戚朋友就能够实现StackOps的Monadic programming:

还是试试运算那个zipIndex函数:

为了实现Free Monad在运行中采用Trampoline运行机制,亲戚朋友能够像Trampoline数据类型一样来实现resume,这个 确定每一步运算土方法的函数:

解译运算(Interpret)是Free Monad的Interpreter功能。亲戚朋友说过要把Trampoline运行机制引入Free Monad运算:

先申明Stack类型: type Stack = List[Int]

 这里的next看起来是多余的,但它代表的是下一步运算。有了它才不可能 得到Functor实例,即使目前每另另一个 操作删剪也有删剪独立步骤。

还是那句话:用另另一个 有Functor实例的类型就能够产生另另一个 Free Monad。如果 亲戚朋友能够用这个 产生的Monad来在for-comprehension里面编写另另一个 算法。

 在上节亲戚朋友介绍了Free Monad的基本状态。能够说Free Monad又是另另一个 以数据形状替换任务管理器堆栈的实例。实际上Free Monad的功能绝对不止越来越,以heap换stack能够成为Free Monad的运算模式,越来越 亲戚朋友能够够放心的使用Free Monad所产生的Monadic编程语言了。前面亲戚朋友介绍了Trampoline的运算模式能够有效处里堆栈溢出问題,而上节的Free Monad介绍里还越来越把Free Monad与Trampoline运算模式挂上钩。亲戚朋友先考虑一下怎样才能在Free Monad数据类型里引入Trampoline运算模式。

亲戚朋友先对比一下Tranpoline和Free这另另一个 数据类型的基本形状:

前面介绍的Free Monad相对都比较简单。实际上Free Monad的Suspend处还能能够是很复杂化的,包括返回结果及接受输入等任何组合。下面亲戚朋友再看另另一个 较复杂化的例子:亲戚朋友能够把State视为三种简单的状态转变编程语言,包括读取及设定状态三种操作指令:

接下来亲戚朋友要把Interact类型升格到Free类型:

亲戚朋友用个实际例子来体验一下用Functor产生Free: