Haskell 中类型表达式的 Lambda?

2024-01-16

Haskell 或特定的编译器是否有类似类型级 lambda 的东西(如果这甚至是一个术语)?

详细说明一下,假设我有一个参数化类型Foo a b并想要Foo _ b成为 Functor 的一个实例。有没有什么机制可以让我做类似的事情

instance Functor (\a -> Foo a b) where
...

?


虽然 sclv 回答了您的直接问题,但我会补充一点,“类型级 lambda”有不止一种可能的含义。 Haskell 有多种类型运算符,但没有一个真正表现得像正确的 lambda:

  • 类型构造函数:引入新类型的抽象类型运算符。给定一个类型A和一个类型构造函数F, 函数应用F A也是一种类型,但除了“这是F应用于A".
  • 多态类型:像这样的类型a -> b -> a隐含的意思是forall a b. a -> b -> a. The forall将类型变量绑定在其范围内,因此行为有点像 lambda。如果我没记错的话,这大致就是系统 F 中的“大写 lambda”。
  • 类型同义词:必须完全应用的类型运算符的有限形式,并且只能生成基类型和类型构造函数。
  • 类型类:本质上是从类型/类型构造函数到值的函数,能够检查类型参数(即,通过类型构造函数的模式匹配,与数据构造函数的常规函数​​模式匹配大致相同)并用于定义类型的成员谓词。它们在某些方面的行为更像常规函数,但非常有限:类型类不是可以操作的一流实体,它们仅对类型进行操作作为输入(而不是输出),对值进行操作仅作为输出(确实不输入)。
  • 功能依赖:与其他一些扩展一起,它们还允许类型类隐式生成类型作为结果,然后可以将其用作其他类型类的参数。仍然非常有限,例如无法将其他类型类作为参数。
  • 类型家族:函数依赖的另一种方法;它们允许以更接近常规值级函数的方式定义类型上的函数。然而,通常的限制仍然适用。

其他扩展放宽了提到的一些限制,或提供部分解决方法(另请参阅:Oleg's type hackery)。然而,几乎您在任何地方都无法以任何方式做的一件事正是您所要求的,即引入具有匿名函数抽象的新绑定范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 中类型表达式的 Lambda? 的相关文章

随机推荐