12

流程图。这种古老的做法已经使用了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

4 回答 4

13

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

但我认为您可以显示电路图(?)。

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

你最好咨询一下导师。

于 2010-05-03T14:34:15.473 回答
4

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

这些天来,我们的编程语言已经达到了一种表达水平,其中算法的意图通过代码本身更清楚地表达了。(也许在 VisualBasic 中没有那么多,但在 Haskell 中肯定是这样。)因此,没有现代编程商店使用流程图。

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

最后,对于您手头的具体问题,请这样考虑:传统流程图主要通过程序演示控制流,因为那是人们当时正在编写的那种代码。然而,总是有一些数据流被说明。对于函数式程序,您将主要演示数据流。

不过,诀窍在于弄清楚如何将(部分应用的)函数流说明为数据。想想流程图必须做些什么来支持可以在两个地方调用的子例程的概念......现在也许你可以创建类似的图形结构来表示“由Ⓐ标识的函数作为filter“I”的第二个参数流入m 想象一个小弓fmap,在侧面刻有一个钥匙孔,用于Ⓐ与箭头连接。

如果不出意外,请将其视为探索程序的替代表示的任务 - 如果您有扩展流程图(不必处理通用函数),并说明这一点,您的讲师应该给您额外的分数!

于 2010-05-03T15:32:59.277 回答
2

嗯...您可以手动将代码编译为基于超级组合器的表示,然后绘制该超级组合器应用程序的类似流程图的图形。在某些情况下,这样做甚至是有用的,它给出了一些合理的流的视觉表示。想想数据流而不是执行流。

于 2010-05-03T14:49:20.420 回答
2

流程图和 FP 的线索是你开始思考功能流。正如您现在可能知道的那样,FP 建立在函数调用函数的基础上来完成工作。如果你没有很好地了解谁将用什么信息给谁打电话,你最终还是会创建意大利面条式代码或创建大量执行相同操作的函数,从而使你的代码很难维护

创建您计划构建的结构化图表,并使用流程图描述事情必须以什么顺序发生,您最终将获得一个可维护且更易于测试的程序。

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

于 2012-04-05T09:04:04.470 回答