【发布时间】:2022-02-13 08:42:03
【问题描述】:
如果这个问题很愚蠢,请原谅我。
在阅读 Haskell 种类时,我注意到一个主题:
*
* -> *
* -> * -> *
我的印象是 Haskell 中的种类最终归结为有多少个星号。你可能会说一个类型的种类实际上只是在它变成 * 之前你需要应用到它的类型的数量。换句话说,您可以计算除最后一个之外的所有 *,并通过整数定义类型的种类。说 0、1、2 等。
这是我的问题:
这是对 Haskell 类型系统的正确观察吗?或者它是否允许除 * 之外的其他东西去你通常看到 * 的地方?例如:
* -> a -> *
例如,我想有人可能想要这样做来约束类型变量以具有类型类的实例。
Functor a, Applicative b => * -> a -> b -> *
是这样的吗?
【问题讨论】:
-
你可以使用
DataKinds,如果你定义了一个data Foo = Foo Nat,你可以定义一个类型type Bar = Foo 42,而Bar有一种Foo。 -
即使将自己限制在
*类型(也称为Type),* -> * -> *和(* -> *) -> *类型也不相同。 -
Nat例如是一种允许使用自然数作为种类的种类。 -
作为@danidiaz 提到的一个常见示例,Monad Transformers 在“现实世界”Haskell 中被广泛使用,并且此类转换器,例如
MaybeT,与(* -> *) -> * -> *类似。
标签: haskell