6

我有一个问题,我认为最好通过函数式编程来解决。

来自非常必要的背景,我习惯于涉及类图/描述、通信图、状态图等的程序设计。然而,这些图都暗示或用于描述系统的状态和各种副作用对系统执行的操作。

在函数式程序的设计中是否使用了任何标准化的图表或数学符号集,或者这些程序最好用简短的函数式伪代码设计(假设函数将比命令式对应物短得多)。

谢谢,迈克

4

4 回答 4

8

函数式编程有一个秘诀。

  1. 它在很大程度上是无状态的,因此传统的命令式图表无关紧要。

  2. 大多数普通的、普通的数学符号也是无状态的。

函数式设计更像是代数。您将定义函数,并表明这些函数的组合会产生所需的结果。

图表不是必需的,因为函数式编程比过程式编程要简单一些。它更像是传统的数学符号。使用数学技术来证明你的各种功能做正确的事情。

于 2009-05-05T16:17:22.537 回答
4

函数式程序员更喜欢写方程式而不是写图表。该游戏称为等式推理,主要涉及

  • 用等号代替等号

  • 应用代数定律

  • 偶尔的归纳证明

这个想法是您编写“明显正确”的非常简单的代码,然后使用等式推理将其变成更清洁和/或性能更好的东西。这门艺术的大师是一位名叫理查德伯德的牛津大学教授。

例如,如果我想简化 Scheme 表达式

(append (list x) l)

我会疯狂地用equals代替equals。使用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

并用equals代替我得到的equals

(if #f
    l
    (cons x (append '() l))

用另一条定律(if #f e1 e2) == e2,我得到

(cons x (append '() l))

如果我再次扩展 append 的定义,我会得到

(cons x l)

我已经证明等于

(append (list x) l)
于 2009-05-07T03:58:57.087 回答
2
于 2010-10-27T01:46:34.783 回答
-1

我对函数式编程了解不多,但这里有两件事我遇到过

  • λ (lambda) 常用于表示函数
  • f ο g 用于表示函数组成
于 2009-05-05T16:29:30.433 回答