为什么ghci desugar类型列表和类型系列?这可以选择性地禁用吗?

Mik*_*cki 93 haskell types ghci

我正在努力使我的库的类型ghci显示尽可能直观,但在使用更高级的类型功能时遇到了很多困难.

假设我在一个文件中有这个代码:

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

import GHC.TypeLits

data Container (xs::[*]) = Container
Run Code Online (Sandbox Code Playgroud)

我在ghci中加载它,然后我输入以下命令:

ghci> :t undefined :: Container '[String,String,String,String,String]
Run Code Online (Sandbox Code Playgroud)

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

:: Container
       ((':)
          *
          String
          ((':)
             * String ((':) * String ((':) * String ((':) * String ('[] *))))))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在,当我向ghci询问使用的类型时LotsOfStrings:

ghci> :t undefined :: Container LotsOfStrings
Run Code Online (Sandbox Code Playgroud)

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

undefined :: Container LotsOfStrings
Run Code Online (Sandbox Code Playgroud)

但是,如果我要求Replicated版本,

ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
Run Code Online (Sandbox Code Playgroud)

当ghci没有为类型同义词做替换时,ghci替换为类型族:

:: Container
       ((':)
          *
          [Char]
          ((':)
             * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
Run Code Online (Sandbox Code Playgroud)

为什么ghci要替换类型系列,而不是类型同义词?有没有办法控制ghci何时进行替换?

小智 0

import GHC.TypeLits

data Container (xs::[*]) = Container
Run Code Online (Sandbox Code Playgroud)

我将其加载到 ghci 中,然后输入以下命令:

:t undefined :: Container '[String,String,String,String,String]
Run Code Online (Sandbox Code Playgroud)