Scala或函数式编程中的组合器是什么

Scala或函数式编程中的组合器是什么,scala,Scala,我正在学习Scala和FP,在一书中,在“功能设计和组合器库”一章中提到了术语组合器,组合器定义如下: 回顾我们的实现,我们会注意到一种常见模式: 对于某些函数,我们的每个函数都有一个形式为RNG=>(a,RNG)的类型 类型A。这种类型的函数称为状态操作或状态 转换,因为它们将RNG状态从一个转换到下一个。 这些状态操作可以使用组合符组合,组合符是 我们将在本节中定义的高阶函数。既然是 我们自己在州里呆了很长一段时间,这是相当乏味和重复的 希望我们的组合器将状态从一个动作传递到下一个动作 自动

我正在学习Scala和FP,在一书中,在“功能设计和组合器库”一章中提到了术语组合器,组合器定义如下:

回顾我们的实现,我们会注意到一种常见模式: 对于某些函数,我们的每个函数都有一个形式为RNG=>(a,RNG)的类型 类型A。这种类型的函数称为状态操作或状态 转换,因为它们将RNG状态从一个转换到下一个。 这些状态操作可以使用组合符组合,组合符是 我们将在本节中定义的高阶函数
。既然是 我们自己在州里呆了很长一段时间,这是相当乏味和重复的 希望我们的组合器将状态从一个动作传递到下一个动作 自动地

那么,组合子是高阶函数还是高阶函数,还是某种技术(设计模式),还是代数类型

为了使回答更准确,问题是: 什么是组合词,它们来自哪里,在哪里使用,它们有什么特别之处

组合子实际上是一个更一般的概念。从字面上讲,组合词是一种结合其他事物的事物。(就像终结者是一个终止其他事物的事物。)

组合器的概念是它组合的事物和组合的事物具有相同的类型,因此您可以根据组合器的结果再次调用组合器

Combinators弹出的一个流行领域是解析,即所谓的Parser Combinator库。其思想是,通过使用组合器构建更简单解析器的组合,从更简单的解析器中构建更复杂的解析器

例如,Parser Combinator库可能只提供一个简单的解析器:可以只解析一个字符的解析器。如果要解析更复杂的内容,库提供了两个组合器:

  • 序列组合器接受两个解析器并生成一个解析器,该解析器识别第一个解析器识别的字符串,然后识别第二个解析器识别的字符串
  • 交替组合器接受两个解析器并生成一个解析器,该解析器识别第一个解析器识别的字符串或第二个解析器识别的字符串
  • 重复组合器接受一个解析器并生成一个解析器,该解析器识别输入解析器识别的字符串的零次或多次重复
使用这三个组合器和基本的“一个字符”解析器,您可以解析所有常规语言

这里重要的是,组合器返回一个新的解析器。它不执行解析器

在函数式语言中,解析器和组合器通常都是函数,因此组合器将是高阶函数。但事实并非如此。例如,解析器可以是对象和组合函数,这使得组合函数只是普通函数

因此,对于组合器,您总是有两件事:

  • 一组特定“种类”的“原语”
  • 一组组合符,取一个或多个特定“种类”的值并返回同一特定“种类”的值
问题的答案可能会有所帮助