Haskell函数组合是管道和过滤器架构模式的实例吗?


9

管道和过滤器的架构模式定义为一系列处理元素,其排列方式是使每个元素的输出为next的输入。每个示例似乎都考虑通过某种共享缓冲区执行的进程间或线程间连接。

在我看来,Haskell函数组合正在执行相同的任务。我们能否说这只是此模式的一个实例,即使它只是关于函数排序,并且没有显式缓冲区用作管道?如果是,对于非惰性语言,我们可以说同样的话吗?

Answers:


8

它们是连接的,但是连接是相反的(某种)。

适当类别中的形态构成可以对功能构成(类别Set用于严格的语言和CPO惰性语言)和过程构成(类别为(AFAIK,未命名)类别,其中对象是字符串,态射是外壳)进行准确建模流程,组成是管道操作员)。可以看到Shell进程,而不会失去一般性或准确性,因为type的(惰性)函数可以将type的String -> WriterT String IO String纯函数String -> String无损地转换为type的函数或从type的函数无损地进行转换String -> Identity String,因此两者实际上都是(>>=)伪装的。


1
什么是CPO类别?我的Google-fu很弱:(
Andres F.

3
@AndresF。CP动脉的类别O
Ptharien的圣火

2

它们是有区别的。管道和过滤器处理数据和数据连接,而Haskell函数组合处理一流的函数。一流的功能可以通过管道和过滤器无法实现的方式来组合。

进一步阅读
在功能编程的上下文中,可组合性是什么意思?


1
合成不一定要处理一流的功能,因为合成本身就是一流的功能。以该函数的composition为例++,composition为.++ . ++将获取一个值并返回该值两次递增的值,但++它不是一流的函数,它仅获取一个值并返回一个值。合成函数是一类函数,它接受两个函数并返回一个。
Jimmy Hoffa 2013年

1
@JimmyHoffa,我认为您正在将“一流功能”与“高阶功能”的概念混淆。当一种语言具有“一流的功能”时,它对待功能的方式与对待其他一流的数据类型相同。它们可以传递给函数,也可以从函数返回,也可以存储在数据结构中,等等。高阶函数通过获取函数参数和/或返回函数值来利用函数的一等性质。
维·皮尔森

@LeviPearson是的,当我早上起草该评论时,我一定是不小心把大脑摆在了一边。如果您要继续在这里闲逛,为P.SE编写优质的内容,请考虑在P.SE的一般聊天中
Jimmy Hoffa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.