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)