什么是单位类型?

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 告诉我 oneElementTuplea -> Unit a 类型。我找不到关于此 Unit 类型的任何文档,而且它似乎不是任何基本类型类的实例,如 ShowFunctor。那么,如果 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 的额外提升)。