什么是单位类型?
What is the Unit type?
通常在 Haskell 中,长度为 1 的元组是不允许的 (AFAIK)。但是,当弄乱模板 Haskell 时,我得到了这个:
oneElementTuple = $(do{
x <- newName "x";
return $ LamE
[VarP x]
(TupE [Just (VarE x)]) -- one element tuple?
})
GHCi 告诉我 oneElementTuple
是 a -> Unit a
类型。我找不到关于此 Unit
类型的任何文档,而且它似乎不是任何基本类型类的实例,如 Show
或 Functor
。那么,如果 Unit
不只是内置魔法,它在哪里定义的呢?有用吗?
在GHC.Tuple
中定义了一个Unit
type。
引用来源:
-- The desugarer uses 1-tuples,
-- but "()" is already used up for 0-tuples
-- See Note [One-tuples] in TysWiredIn
data Unit a = Unit a
没什么特别的。它没有特殊的元组语法。看起来 TH 在尝试像您那样制作 one-tuple 时使用这种类型。
请注意,由于此类型位于 GHC.
模块内,因此被视为 low-level。通常,在日常编程中需要 one-tuple 时,人们会使用 Identity
新类型(这也避免了 Unit
的额外提升)。
通常在 Haskell 中,长度为 1 的元组是不允许的 (AFAIK)。但是,当弄乱模板 Haskell 时,我得到了这个:
oneElementTuple = $(do{
x <- newName "x";
return $ LamE
[VarP x]
(TupE [Just (VarE x)]) -- one element tuple?
})
GHCi 告诉我 oneElementTuple
是 a -> Unit a
类型。我找不到关于此 Unit
类型的任何文档,而且它似乎不是任何基本类型类的实例,如 Show
或 Functor
。那么,如果 Unit
不只是内置魔法,它在哪里定义的呢?有用吗?
在GHC.Tuple
中定义了一个Unit
type。
引用来源:
-- The desugarer uses 1-tuples,
-- but "()" is already used up for 0-tuples
-- See Note [One-tuples] in TysWiredIn
data Unit a = Unit a
没什么特别的。它没有特殊的元组语法。看起来 TH 在尝试像您那样制作 one-tuple 时使用这种类型。
请注意,由于此类型位于 GHC.
模块内,因此被视为 low-level。通常,在日常编程中需要 one-tuple 时,人们会使用 Identity
新类型(这也避免了 Unit
的额外提升)。