我正在尝试使我的库的 ghci 类型显示尽可能直观,但是在使用更高级的类型功能时遇到了很多困难。
假设我在文件中有这段代码:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Container (xs::[*]) = Container
我在 ghci 中加载它,然后输入以下命令:
ghci> :t undefined :: Container '[String,String,String,String,String]
不幸的是,ghci 给了我相当丑陋的外观:
:: Container
((':)
*
String
((':)
* String ((':) * String ((':) * String ((':) * String ('[] *))))))
ghci 删除了类型级别字符串的糖。有什么办法可以阻止 ghci 这样做并只给我漂亮的版本吗?
在相关说明中,假设我创建了一个类型级Replicate
函数
data Nat1 = Zero | Succ Nat1
type family Replicate (n::Nat1) x :: [*]
type instance Replicate Zero x = '[]
type instance Replicate (Succ n) x = x ': (Replicate n x)
type LotsOfStrings = Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String
现在,当我使用 ghci 询问类型时LotsOfStrings
:
ghci> :t undefined :: Container LotsOfStrings
ghci 很好,给了我漂亮的结果:
undefined :: Container LotsOfStrings
但如果我要Replicate
d 版本,
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
当 ghci 对类型同义词没有这样做时,它会替换类型族:
:: Container
((':)
*
[Char]
((':)
* [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
为什么 ghci 代替类型族,而不是类型同义词?有没有办法控制 ghci 何时进行替换?