2016-02-28 58 views
3

我明白我可以促進Bool那種水平,像這樣,在Bool有可能成爲TrueFalse數據類型是提升爲那種級別只有一個值

{-# LANGUAGE DataKinds #-} 
{-# LANGUAGE TypeFamilies #-} 

type family TF t :: Bool 
type instance TF Int = True 
type instance TF Bool = False 

我想,而不是促進()當然這隻有一個值()。但是,這似乎並沒有工作:

{-# LANGUAGE DataKinds #-} 
{-# LANGUAGE TypeFamilies #-} 

type family TF t ::() 
type instance TF Int =() 
type instance TF Bool =() 

我想我可以只使用BoolTrue,但有一個有價值的類型,可晉升爲樣的水平?

回答

6

嘗試使用'()代替()在類型級別:

type family ToNull t ::() 
type instance ToNull Int = '() 
type instance ToNull Bool = '() 

而且TrueFalse實際上是速記的'True'False在類型級別。

的問題是有四個()的範圍:

  1. 普通型的()*
  2. 的1只構造這也是()
  3. 促進了那種 ()
  4. 類型'()類型()由2升級而來,其類型同義詞()默認爲

沒有有時可選的單引號,1和4是不明確的。

您可以檢查GHC的用戶指南詳細信息:7.9. Datatype promotion

+0

感謝。只是好奇,是「真」還是「假」,或者我可以同樣定義'()'? – Clinton

+0

@Clinton'True'和'False'是''True'和''False'的類型同義詞,爲方便起見'DataKinds'語言擴展定義。對於Bool來說是可以的,但是當類型和構造函數具有相同的名稱時會有歧義,因此通常可選的單引號是必需的。 – zakyggaps

+3

甚至有第五個「()」造成額外的混亂:空的約束。 – dfeuer

相關問題