有人可以澄清组合器是什么吗?一个函数还需要一个组合器?有正式的定义吗?通过Scala中的函数式编程,这两个术语似乎可以互换使用。
答案 0 :(得分:0)
传统上,函数代表程序的模块。另一方面,组合器并不真正代表同一意义上的模块;相反,它们用于将模块组合成一个完整的程序。
组合子'组合'两个(或更多)值,使得参数是结果的“一部分”。识别组合子的启发式方法是,它们至少使用与自己的结果相同(或类似)类型的一个参数。[1]所以,例如,many
(伪Haskell):
many :: Parser a -> Parser [a]
是一个组合子,因为它需要一个解析器并返回一个解析器,因为解析器p
是解析器many p
的一部分。
length :: [a] -> Int
不是组合子,因为它接受一个列表但返回Int
,并且因为它从其参数中丢弃了大部分信息。
(+) :: Int -> Int -> Int
也不是组合子,因为当它需要Int
并返回Int
时,它仍会从其参数中丢弃部分信息; 2
和3
并非真正属于'5
,p
属于many p
。
直觉是,当你编写程序时,首先将它构造成碎片:解析输入的第一位,解析这个重复的元素,解析其余的元素,将解析树放在一起。你编写这些部分,然后对它们应用组合器来获得最终的程序:
putThePiecesTogether <$> parseTheFirstBit <*> many parseRepeatedBit <*> parseTheRest
[1]组合器来自组合子库,它们也有'0参数'组合子(常数或其他类型的函数)。这些也是库的重要组成部分,它们本身可能是组合器,所以真正的规则是组合器来自一个库,其大多数函数都采用和返回相同类型的值,以这种方式参数是'结果'的一部分。