haskell - 种类级别的括号是什么意思?

标签 haskell polymorphism type-kinds

我了解以下几种:

String :: *
[] :: * -> *
(->) :: * -> * -> *
(,) :: * -> * -> *

但是这个 kind 是什么意思以及它代表什么类型?

? :: (* -> *) -> *

最佳答案

?::(* -> *) -> * 意味着如果你给 ? 类似的东西 * -> *,你会得到一个类型(某种*)。让我们举一个具体的例子:

newtype IntContainer f = IC { getContainer :: f Int }

这意味着包含Int。我可以用列表、集合或任何我想要的东西(* -> *)作为底层数据结构来创建 IntContainer。问题是 f 这里不是类型 - 它需要先应用另一种类型才能成为类型。因此:IntContainer 需要对其应用一些东西,而这又需要对其应用一种类型。

ghci> :kind IntContainer
IntContainer :: (* -> *) -> *

我可以通过将 * -> * 类型的东西应用到 IntContainer 来创建具体类型:

ghci> ic1 = IC [1,2,3]
ic1 :: IntContainer []                           -- [] :: * -> *
ghci> ic2 = IC (Data.Set.fromList [1,2,3])
ic2 :: IntContainer Set                          -- Set :: * -> *
ghci> ic3 = IC (Data.Sequence.fromList [1,2,3])
ic3 :: IntContainer Seq                          -- Seq :: * -> *

关于haskell - 种类级别的括号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46453439/

相关文章:

haskell - 在 Haskell 中提升类实例

Java 多态转换 - 运行时错误 ClassCastException

haskell - 如何正确访问 `Constraint` 类型?

haskell - 什么是 "System FC2 grammar for Kinds"?

list - 在haskell中获取列表的排列?

linux - 无法升级 cabal 本身

Haskell 等效于 python -m http.server?

java - 如何配置 Jackson 以反序列化包含在基类上使用 @JsonTypeInfo 和 JsonSubTypes 注释的命名类型的列表?

java - 在另一个类的构造函数中传递类类型?

haskell - 类型族强制参数具有类型 *