代码之家  ›  专栏  ›  技术社区  ›  LukeN

流程图功能编程语言

  •  11
  • LukeN  · 技术社区  · 15 年前

    Flowcharting。这种古老的做法已经使用了1000多年了,强迫我们贫穷的学生,没有任何用处(我认为也是)。它可以很好地与命令式、顺序运行的语言一起工作,但是我所钟爱的函数式编程呢?

    不幸的是,我不得不为我的程序(用haskell编写)创建一个流程图。

    我认为这样做很容易:

    main :: IO ()
    main = do
       someInput <- getLine
       let upped = map toUpper someInput
       putStrLn upped
    

    这只是3个顺序步骤,获取数据,将其大写,然后输出。

    这次情况看起来更糟:

    main :: IO ()
    main = do
       someInput <- fmap toUpper getLine
       putStrLn someInput
    

    或者像这样:

    main :: IO ()
    main = interact (map toUpper)
    

    好吧,那是IO,你可以像命令式语言那样处理它。纯函数呢?

    一个实际例子:

    onlyMatching :: String -> [FilePath] -> [FilePath]
    onlyMatching ext = filter f
       where f name = lower ('.' : ext) == (lower . takeExtension $ name)
             lower  = map toLower
    

    最后一个流程图是怎样的?

    4 回复  |  直到 13 年前
        1
  •  12
  •   kennytm    15 年前

    我不认为流程图,它代表过程(因此状态的变化),是适合于FP的,它主要是无状态的。

    但我想你可以展示一个电路图(?).

            ext
           _ | ______________________________________________
          |  |                                               |
          |  `-> [ '.' : ] -------> [ lower ] --.__          |
          |                                      __ [ == ] ----->
    name --> [ takeExtension ] ---> [ lower ] --'            |
          |__________________________________________________|
                                  f
    

    你最好请教老师。

        2
  •  4
  •   MtnViewMark    15 年前

    事实上, flowcharts 在软件中使用可以追溯到60年前。(实际上,正如我们所知,编程只能追溯到65年!)当时,它们作为一种工具,在“编码”这一非常繁琐且容易出错的阶段之前,作为规划和开发算法的工具,是极其重要的。

    现在,我们的编程语言已经达到了一个表达水平,在这个水平上,算法的意图由代码本身更清晰地表达出来。(也许在VisualBasic中没有那么多,但在Haskell中肯定如此。)因此,没有现代编程商店使用流程图。

    然而, visual programming languages 存在,并在某些领域取得了巨大的成功。这些环境与流程图有关。也许你的指导老师真的在准备做一些比较编程语言的工作,并引导你们思考这些方法。

    最后,对于您手头的特定问题,请这样考虑:传统流程图主要通过程序演示控制流,因为这是当时人们编写的代码类型。然而,总是有一些数据流的说明以及。对于一个功能性程序,您将主要演示数据流。

    不过,诀窍在于找出如何说明(部分应用)函数作为数据的流程。想想流程图必须做些什么来支持子例程的概念,它可以在两个地方被调用…现在,也许您可以创建类似的图形结构来表示“由标识的函数作为第二个参数 filter “我在想象一个有标签的小蝴蝶结 fmap 在侧面开一个钥匙孔,以便用箭头连接。

    如果没有别的,可以把它看作是探索程序的替代表示的一项任务——如果你已经扩展了流程图(它不需要处理一般的函数),并且清楚地表明了这一点,那么你的指导老师应该给你额外的分数!

        3
  •  2
  •   SK-logic    15 年前

    Hm.…您可以手动将代码编译成一个基于超级组合器的表示,然后绘制一个类似流程图的超级组合器应用程序图。在某些情况下,这样做甚至是有用的,给出了流的一些合理的可视化表示。只需考虑数据流而不是执行流。

        4
  •  1
  •   Vincent Bevort    13 年前

    流程图和fp的线索是您开始在函数流中思考。 正如您现在可能知道的,fp构建在调用函数以完成任务的函数上。 如果你没有一个好的印象,谁会用什么信息给谁打电话,你最终还是会创建意大利面代码或创建大量的函数,做同样的事情,使代码很难维护。

    用一个流程图创建一个你计划构建的结构化图表,描述事情发生的顺序,最终你将得到一个可维护且易于测试的程序。

    对于不熟悉结构图的用户,这是一种使用发送和返回值对从调用者到接收者的函数调用进行建模的方法。使用它,如果您已经有了一个函数,您可以轻松地从IE配置文件中检索数据,并在系统中的任何地方重用它。

    推荐文章