泛函编程(34)-泛函变量:处理状态转变-ST Monad

  • 时间:
  • 浏览:8
  • 来源:uu快3计划师_uu快3app苹果_全天计划

  泛函编程的核心模式全都函数组合(compositionality)。实现函数组合的必要条件之一全都参与组合的各方任务管理器都需只是纯代码的(pure code)。所谓纯代码全都任务管理器中的所有表达式都需只是Referentially Transparent(RT,等量可替换的),它的意思是:在一段任务管理器p中,所有的表达式e都都都能不能用e的运算结果替代而不影响到p的运算结果,那末e全都RT等量可替换的,也全都说任务管理器p是由纯代码组成的。但可能性任务管理器p暗含 晒 了全都变量,哪几种变量的情況就会影响到任务管理器中e的运算结果,那末p就不再是纯代码了,也就无法保证函数组合的正确性了。全都在泛函编程模式中好像是禁止任何情況变化的(state mutation)。但实际上泛函编程并那末任何明文禁止有4个函数内控 使用情況转变,全都:可能性有4个函数f(x)的输入参数x是RT等量可替换的,那末函数f还是个纯函数(pure function)。

针对以上需求,有4个新的数据类型产生了:ST Monad,大家 看看它的定义:

以上函数即使使用了while loop, 变量var及可变数组Array,但哪几种都被限制在函数内控 ,全都quicksort还是个纯函数。

大家 希望达到的目的是通过内存参考(memory reference)对变量情況转变进行控制。大家 需要实现的土法律依据包括:

大家 希望借scala的类系统(type system)来帮助大家 阻止不安全的ST操作成功编译(compile)。具体实现土法律依据如下:

ST[S,Int]暗含 了有4个值,全都你是什么ST动作是安全的。

ST是个Monad,大家 都都能不能制造有4个for-comprehension的Monadic语言来进行泛函变量情況转变。大家 的变量类型数据行态封装了有4个变量:protected var,如下:

ST[S,STRef[S,A]

分配新的内存单元(memory cell)

ST[S,Int]

泛函编程采用的是并需要补救变量情況变化的编程语言。在前面大家 可能性讨论过State Monad,它都都能不能对情況进行读写。State Monad的运作模式是:S => (A,S),即:传入有4个情況S,产生有4个新的值及新的情況。对于补救本地情況转变,大家 需要要对传入的S进行补救,全都把它作为并需要标记让拥有同样标示S的函数都都能不能对变量进行转变。

下一步全都如何运算以上的表达式了。大家 希望能安全的运算变量情況转变,那末考虑以下并需要ST操作:

读取内存单元数据

存写内存单元数据

你是什么ST和State基本上一致,全都情況转变函数run不对外开放:protected def run(s: S): (A,S),这是可能性S代表了都都能不能转变情況的权限,大家 希望把你是什么权利局限在ST类内控 。ST实现了flatMap,全都是个Monad。

然后,使用了局部变量后往往迫使代码变得很臃肿。任务管理器变得复杂性影响了代码的理解、维护及重复利用。

前面的ST动作包括了有4个变量参考,使用者能通过STRef来修改变量,你是什么操作是不安全的。

    为了方便可能性提高运算时延,大家 往往可能性在有4个函数内控 使用全都变量(local variables)。可能性哪几种变量的情況转变只体现在函数内控 ,那末对于你是什么函数的用户来说,这是个纯函数,使用你是什么函数进行函数组合是那末大大问题 的。大家 看看下面的你是什么例子: