我对你的目标有点困惑,但让我们一点一点地来看看,也许我会找到正确的观点:
:t
告诉你变量的类型;应用于类型时没有任何意义,因为它只会返回您传递的内容。请注意这里的错误告诉您:t
需要某种数据值作为参数:
Prelude> :t Maybe
<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> :t (Maybe Integer)
<interactive>:1:2: Not in scope: data constructor `Maybe'
<interactive>:1:8: Not in scope: data constructor `Integer'
您可以创建部分类型:
Prelude> type T = Maybe
Prelude> Just 5 :: T Integer
Just 5
type T a = Maybe a -- alternately, with explicit type parameters
Prelude> Just 'a' :: T Char
Just 'a'
您不能为部分类型创建数据构造函数,因为它们不代表数据。Maybe
没有在类型上参数化的情况下,a 可以或具有哪些值Vector
?您可能倾向于认为Maybe
可能具有 value Nothing
,但Nothing
键入为:
Prelude> :t Nothing
Nothing :: Maybe a
关键是 thatNothing
可以是any Maybe a
,但它仍然需要a
知道它是Nothing
. (这有点像我告诉你“给我拿一杯”而不是“给我拿一杯任何东西”——在我至少完成我的想法之前,你不能有效地遵守)。
您当然可以创建部分应用的函数,一旦应用它们就会返回一个完整的类型:
Prelude> let f = Just :: a -> T a
Prelude> f 5
Just 5
Prelude> :t f 'a'
f 'a' :: T Char