什么使一个函数也成为一个组合?

时间:2014-12-09 22:47:08

标签: functional-programming

有人可以澄清组合器是什么吗?一个函数还需要一个组合器?有正式的定义吗?通过Scala中的函数式编程,这两个术语似乎可以互换使用。

1 个答案:

答案 0 :(得分:0)

传统上,函数代表程序的模块。另一方面,组合器并不真正代表同一意义上的模块;相反,它们用于将模块组合成一个完整的程序。

组合子'组合'两个(或更多)值,使得参数是结果的“一部分”。识别组合子的启发式方法是,它们至少使用与自己的结果相同(或类似)类型的一个参数。[1]所以,例如,many(伪Haskell):

many :: Parser a -> Parser [a]

是一个组合子,因为它需要一个解析器并返回一个解析器,因为解析器p是解析器many p的一部分。

length :: [a] -> Int

不是组合子,因为它接受一个列表但返回Int,并且因为它从其参数中丢弃了大部分信息。

(+) :: Int -> Int -> Int

也不是组合子,因为当它需要Int并返回Int时,它仍会从其参数中丢弃部分信息; 23并非真正属于'5p属于many p

直觉是,当你编写程序时,首先将它构造成碎片:解析输入的第一位,解析这个重复的元素,解析其余的元素,将解析树放在一起。你编写这些部分,然后对它们应用组合器来获得最终的程序:

putThePiecesTogether <$> parseTheFirstBit <*> many parseRepeatedBit <*> parseTheRest

[1]组合器来自组合子库,它们也有'0参数'组合子(常数或其他类型的函数)。这些也是库的重要组成部分,它们本身可能是组合器,所以真正的规则是组合器来自一个库,其大多数函数都采用和返回相同类型的值,以这种方式参数是'结果'的一部分。