为什么ghci desugartypes列表和types的家庭? 可以select禁用吗?

我试图使我的图书馆的typesghci显示尽可能直观,但我遇到了很多困难,当使用更先进的typesfunction。

比方说,我有一个文件中的这个代码:

{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import GHC.TypeLits data Container (xs::[*]) = Container 

我用ghci加载它,然后input以下命令:

 ghci> :t undefined :: Container '[String,String,String,String,String] 

不幸的是,ghci给了我相当难看的样子:

 :: Container ((':) * String ((':) * String ((':) * String ((':) * String ((':) * String ('[] *)))))) 

ghci已经删除了types级别string的糖。 有没有办法阻止ghci这样做,给我只是漂亮的版本?


在相关的说明,让我们说我创build一个types级Replicatefunction

 data Nat1 = Zero | Succ Nat1 type family Replicate (n::Nat1) x :: [*] type instance Replicate Zero x = '[] type instance Replicate (Succ n) x = x ': (Replicate nx) type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String 

现在,当我问使用LotsOfStringstypes的ghci时:

 ghci> :t undefined :: Container LotsOfStrings 

ghci很好,给了我漂亮的结果:

 undefined :: Container LotsOfStrings 

但是如果我要求Replicate版本,

 ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String) 

ghci替代types家族,当它不这样做的types同义词:

 :: Container ((':) * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *)))))) 

为什么ghci做types家庭的替代,而不是types的代名词? 有什么办法可以控制ghci何时进行replace?

我所知道的解决方法是使用:kind。 例如,

ghci>:kind(Container'[String,String,String,String,String])

得到:

(Container'[String,String,String,String,String]):: *

ghci>:善良! (Container'[String,String,String,String,String])

将打印这样的东西:

容器

((“:)

  * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *)))))) 

当然,官方正在向ghci提出一个不同的问题,但这个问题很有效。 无论如何,使用undefined ::是一种解决方法,所以我认为这可能就足够了。

这在即将到来的GHC 7.8中得到解决。

如果数据types使用PolyKinds,GHC 7.6将打印种类。 所以你看到(':) * String ('[] *)而不是(':) String '[]

在GHC 7.8中,默认情况下不再显示types,而且您的数据types可以打印成列表。 您可以使用新的标志-fprint-explicit-kinds来查看GHC 7.6中的显式types。 我不知道这个原因,可能是明确的types是帮助理解PolyKinds。

 import GHC.TypeLits data Container (xs::[*]) = Container 

我用ghci加载它,然后input以下命令:

 :t undefined :: Container '[String,String,String,String,String]