为什么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级Replicate
function
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
现在,当我问使用LotsOfStrings
types的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]