Haskell 组合器和超级组合器有什么区别?

Haskell 组合器和超级组合器有什么区别?,haskell,Haskell,组合器和超级组合器有什么区别?它们都不包含任何自由变量。这是我知道的一件事 超级组合子是常量,或只包含超级组合子作为子表达式的组合子 或者更全面地说 任何lambda表达式的形式为\x1 x2。。xn->E,其中E不是 lambda抽象与n≥0(请注意,如果表达式不是 lambda抽象,n=0。)这是一个超级组合器,当且仅当: E中唯一的自由变量是x1..xn和 E中的每个lambda抽象都是一个超级组合器 组合符不包含任何自由变量,但可能有一个子表达式包含自由变量。 例如,从 外lambd

组合器和超级组合器有什么区别?它们都不包含任何自由变量。这是我知道的一件事

超级组合子是常量,或只包含超级组合子作为子表达式的组合子

或者更全面地说

任何lambda表达式的形式为\x1 x2。。xn->E,其中E不是 lambda抽象与n≥0(请注意,如果表达式不是 lambda抽象,n=0。)这是一个超级组合器,当且仅当:

  • E中唯一的自由变量是x1..xn和
  • E中的每个lambda抽象都是一个超级组合器
组合符不包含任何自由变量,但可能有一个子表达式包含自由变量。 例如,从

外lambda函数实际上是一个组合器,因为它没有自由变量,但是它的子表达式
\x->gx2
有一个自由变量(
g
),因此它不是一个组合器。因此,
\fg->f(\x->gx2)
不能是超级组合器

超级组合子是常量,或只包含超级组合子作为子表达式的组合子

或者更全面地说

任何lambda表达式的形式为\x1 x2。。xn->E,其中E不是 lambda抽象与n≥0(请注意,如果表达式不是 lambda抽象,n=0。)这是一个超级组合器,当且仅当:

  • E中唯一的自由变量是x1..xn和
  • E中的每个lambda抽象都是一个超级组合器
组合符不包含任何自由变量,但可能有一个子表达式包含自由变量。 例如,从


外lambda函数实际上是一个组合器,因为它没有自由变量,但是它的子表达式
\x->gx2
有一个自由变量(
g
),因此它不是一个组合器。因此,
\fg->f(\x->gx2)
不能是超级组合器

解释,可以在这里找到一个不是超级组合器的组合器示例:这里可以找到解释和一个不是超级组合器的组合器示例:公平地说,顶部的定义是这样写的:唯一可能的超级组合子是常数。例如,
\x->x
不能是一个超级组合符,因为(1)它不是一个常数,(2)它包含一个子表达式
x
,它不是一个超级组合符。@FyodorSoikin该定义来自Haskell Wiki,我只接受了简单的一点,因为我认为它的意思很明显,但为了公平起见,我现在将更新它,顶部的定义是这样写的:唯一可能的超级组合子是常数。例如,
\x->x
不能是一个超级组合符,因为(1)它不是一个常数,(2)它包含一个子表达式
x
,它不是一个超级组合符。@FyodorSoikin该定义来自Haskell Wiki,我只接受了简单的一点,因为我认为它的意思很明显,但我现在要更新它
\f g -> f (\x -> g x 2)