Haskell程序可以类似于将消息传递给彼此的对象吗?

时间:2016-10-30 15:11:10

标签: haskell smalltalk object-oriented-analysis

Haskell是一种纯函数式语言,它突破了传统的面向对象语言。但是,请考虑Alan Kay关于OOP“真实”含义的以下引用:

  对我来说,OOP意味着只有消息传递,本地保留和保护以及隐藏状态进程,以及所有事物的极端后期绑定。它可以在Smalltalk和LISP中完成。可能还有其他可能的系统,但我不知道它们。 - Alan Kay

以及后来:

  

我认为对象就像生物细胞和/或网络上的个人计算机一样,只能与消息进行通信(所以消息一开始就出现了 - 需要一段时间才能看到如何用编程语言进行消息传递有效地发挥作用。)

我很好奇在Haskell中可以在多大程度上实现这种编程风格。特别是,是否可以将Haskell程序构造为(类似的)封装对象的序列来回传递消息

注意:我正在寻找Haskell特有的示例,而不是大型函数语言(冲突时)。

1 个答案:

答案 0 :(得分:3)

  

仅消息传递,本地保留和保护以及隐藏   状态过程

     仅像生物细胞和/或网络上的个人计算机一样   能够与消息沟通

我相信某些Haskell编程模式在某种程度上与Kay的描述相似。

在像conduitpipesstreaming这样的流媒体库中,通常将计算构建为由不同阶段组成的管道。管道的每个部分都完全独立于其他部分,并且可以保持其自己的私有状态(您也可以在管道中共享"状态)。

拓扑往往是线性和单向的。也就是说,{em> conduit ZipSink等抽象 - 以及foldl包中Applicative的{​​{1}}实例 - 让你建造"树状"拓展的拓扑结构。 管道可以是bidirectional,虽然我还没有看到很多使用它的例子。

然后有arrowized functional reactive programming。它可以让你构建"电路"自动机箭头can even include loops。电路的每个部分都可以保持自己的状态。正如netwire FRP库的描述所述:

  

此库为有用的线箭提供接口和实现   功能反应式编程(FRP)和本地有状态   编程(LSP)。

来自auto库的文档:

  

auto通过提供封装值流的类型来工作   变压器或本地有状态功能;通过指定你的   程序作为价值之间关系的(可能是循环的)图   您可以创建一种基于静态声明系统的方法   数量之间的关系。

     

而不是所有函数都具有的状态monad类型解决方案   访问刚性全局状态,通过指定关系自动工作   每个都独立存在,独立存在,没有任何全球性   状态。