多核时代的移动开发(三)-你不能不知道的F#

        咱们新一期的大话并行开发又与大家见面了,与上次一样咱们这次还是先做一下小结,如果您看过上一次的博客,您会了解这样的观点,编程从某方面说就是管理者管理运营一个组织的抽象描述。面向对象编程思想的兴起,反应的就是在组织不断的演变过程中,组织中各项职能不断分化形成子部门,或者说模块化的情况,那么面向对象中的依赖反转原则其实就是这种模块化管理的必然推论,每个部门都封装了自己工作的细节,而部门间则是通过接口进行沟通,例如JAVA、C#这种面向对象类的语言则是管理工具。
        现在函数式语言或者说是并行计算的兴起,其实为了应对组织中参与者不断增多,但是执行效率却没有相应增高的情况,其实这时候F#还是管理工具,关键在怎么能把新的管理理念引入进来,那么好循着上次的故事脉络继续我们今天的话题。
        开始医院院长请来的这位职业经理人先考察了一下医院的情况,并确定了他的工作方向是提高患者就医的效率,而不是提高生产型企业的生产率后,欣然接受了邀请。
评注:请注意我们的职业经理人F#是数据计算专业的,解决问题的范型是数据加工与计算,而病人的就医并确诊的过程,可以抽象成为一个数据加工的过程,与他的专业匹配。而如果你的目的是要像生产线的管理者那样做流程控制,那么可能并行计算的相关思想并不会适用。
       然后这位项目经理提出了几点意见,首先对患者要进行分流,对于急病重症患者全部从门诊分流,门诊只处理病情不会有重大变化的一般病人,并且对于门诊病人做出以下规定,原则上每类检查只做一次,避免一有需要就重做一次检查。当然这可能和现在医院里的做法不一样,医生总是希望你多做一些检查甚至是重做一些检查,但是我们要说的是提高患者就医的效率,不是医院怎么赚钱:),所以重复诊断的现象必须避免,才能提高效率。
       评注:门诊的工作就是根据患者的症状来得出患者的病情,抽象来说就是对一数值进行计算并得出最终的结果,那么好了,举个简单的例子,假如result x=f(x)+f(x)^2+g(x)*f(x),那么直观的来看,在计算过程中函数f(x)最好只计算一次,这也就是职业经理人提出的每个检查只做一次的办法,不过这也要求了在计算过程中的输入是不变的值(VALUE),而不是任意变化的变量(VAR),假如病人的病情不断的变化,重复的检查无法避免。那么这也就解释了为什么F#当中所有参数在默认情况都是不变的值,而不是变化的量。
       这里我再次强调门诊的这个例子,是可以抽象成数据加工的过程。如果您是要做急诊危重病人的数据采集与检测,那么这也不是F#的所擅长的。
       第二、也是原则性的问题,对于医院内的医疗资源采取谁使用,谁访问的原则,规定向对CT、病例这类资源的由专人管理,一般人不得访问。原因也很简单,大家可能也有亲身体会,像传真机、打印纸这种大家都能用的公共资源是经常出问题的,而且容易在关键时候掉链子,造成这个问题的原因也很简单,大家都在用,出了问题难以也不知道是谁造成的。
      评注:可能大家也想到了这个例子是在说全局变量的问题,在函数式编程中减少全局变量或者说是谁使用谁访问的原则非常重要,否则真的难免会出现BUG。
      第三、采用模式匹配的方案而代替原来的条件判断的方案来进行病人的导诊。简单的说,以前病人来到医院的导诊台,首先判断病人是外伤还是身体内部的问题来分内外科,再通过病变的位置判断具体要看哪一科,这是一个典型的串行处理的模式,而新来的方案则要求病人将病情录入电脑,各科室同时判断该病人的症状是否属于本科室所诊治的范围,如果符合则让该病人在本科室就诊。
      评注:这个例子其实是说如果您采用了

           if(a>b)操作一
            else if(b<a<c)操作二
            else 操作三

        这种模式的情况下,很明显这段代码是要顺利执行的,而且如果你的这些参数a、b还是变量的话,那么每次用到可能还需要重新计算。
但是如果你采用模式匹配的模式,那么伪代码是这样的,
            Switch a
            Matten with casse b 操作一
            Matten with casse c 操作二
            Matten with casse d 操作三
        这是一个典型的单一数据多指令的结构,假如在这个输入A是不变量的基础上则完全可以则几个CPU同时进行匹配。回到咱们的故事当中就是让病人的病情这个值,在各个科室间进行匹配,而不是按照顺序一步一步做判断。这也就解释了为什么F#要用模式匹配,而不是IFELSE的架构来实现算法。
第四、按照病人的需要给病人制订诊断计划,假如病人验血还不是得出最终诊断结论的必要条件的话,就先不给病人验血。简单的说所有的检测都要在推迟到必要时才做。
       评注:虽然道理说的简单,但是延迟计算其实是深深的变革了之前的编程理念,回到刚刚的例子,所谓的延迟计算就是院长只制订相关规则,至于何时用,怎么用则由经理来安排。而我们之前的编程语言,编译器都会严格按照代码来执行相应程序的。也就是程序员既要制订执行的规则,也要确定执行的时序。但是在延迟计算这种理念下,程序员只定规则,执行的时序由F#这个职业经理人去管。这其实是和我们前二篇所说的理念是一致的,那就是程序员只定义要的结果,至于如何得出结果在不违反规则的情况由职业经理人去管。
        总的来说F#体系中最主要的特点就是程序员制定规则,而不过多干涉具体的执行,一般用不变的VALUE作为参数参与运算,用模式匹配来替代IFELSE的判断,尽量避免全局变量。其实有关F#还有很多有意思的现象,比如递归,还有延迟计算的一些推论,咱们下次再说。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值