我遇到了一个问题,我认为最好通过功能编程方式解决。
来自一个非常迫切的背景,我习惯于程序设计涉及类图/描述,通信图,状态图等。然而,这些图表,所有暗示或用于描述系统的状态和各种行动对系统产生的副作用。
在功能程序的设计中是否使用了任何标准化的图表或数学符号,或者这些程序是在短函数伪代码中最佳设计的(假设函数将比命令式对应函数短得多)。
谢谢,迈克
答案 0 :(得分:7)
函数式编程有一个秘密技巧。
它基本上是无国籍的,所以传统的命令图并不重要。
大多数普通的花园式数学符号也是无国籍的。
功能设计更像是代数而不是其他任何东西。您将定义函数,并显示这些函数的组合产生所需的结果。
图表不是必需的,因为函数式编程比程序编程简单一些。它更像传统的数学符号。使用数学技术来表明您的各种功能都能做正确的事情。
答案 1 :(得分:4)
功能程序员更多的是编写方程式然后编写图表。该游戏被称为等式推理,它主要涉及
将等于等于
应用代数定律
偶尔通过归纳证明
这个想法是你编写非常简单的“明显正确”的代码,然后你使用等式推理将它变成更干净和/或性能更好的东西。这位艺术大师是一位名叫理查德·伯德的牛津教授。
例如,如果我想简化Scheme表达式
(append (list x) l)
我会像疯了一样等于等于等于。使用list
的定义我得到
(append (cons x '()) l)
附上我追加的附件
(if (null? (cons x '()))
l
(cons (car (cons x '())) (append (cdr (cons x '())) l)))
现在我有这些代数定律:
(null? (cons a b)) == #f
(car (cons a b)) == a
(cdr (cons a b)) == b
并用等于等于等于我得
(if #f
l
(cons x (append '() l))
根据另一项法律(if #f e1 e2) == e2
,我得到了
(cons x (append '() l))
如果我再次花费附加的定义,我会得到
(cons x l)
我已经证明的等于
(append (list x) l)
答案 2 :(得分:2)
答案 3 :(得分:-1)
我对功能编程知之甚少,但这里有两件事我已经遇到过