当前位置: 首页 > 知识库问答 >
问题:

为什么ghci要取消类型列表和类型族?这可以选择性地禁用吗?

戚侯林
2023-03-14

我试图使ghci为我的库显示的类型尽可能直观,但在使用更高级的类型特性时遇到了很多困难。

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

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

import GHC.TypeLits

data Container (xs::[*]) = Container

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

ghci> :t undefined :: Container '[String,String,String,String,String]
:: Container
       ((':)
          *
          String
          ((':)
             * String ((':) * String ((':) * String ((':) * String ('[] *))))))
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> :t undefined :: Container LotsOfStrings
undefined :: Container LotsOfStrings
ghci> :t undefined :: Container (Replicate (Succ (Succ (Succ (Succ (Succ Zero))))) String)
:: Container
       ((':)
          *
          [Char]
          ((':)
             * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))

为什么ghci要替换类型族,而不是类型同义词?有没有办法控制ghci什么时候做替换?

共有1个答案

孙翰墨
2023-03-14

我知道的变通方法是使用:仁慈。例如,

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

给出:

  *
  [Char]
  ((':)
     * [Char] ((':) * [Char] ((':) * [Char] ((':) * [Char] ('[] *))))))
 类似资料:
  • 我想知道GHCi中(或其他地方)是否存在将类型同义词和族扩展出任意类型表达式的功能。

  • 我正在尝试使用一个websocket发送音频消息,我应该将音频流改为什么类型的消息,以便我可以使用一个socket发送?如果我直接使用一个WebSocket.send(音频),我会得到一个错误“DOMException”,我应该把它改为二进制数据吗?怎么做的?我是一个全新的程序,所以请帮助!!!

  • 我正在使用SpringBoot和@JmsListener从同一个QManager中的多个队列中检索IBM MQ消息。到目前为止,我可以得到没有任何问题的消息。但也有可能出现这样的情况,我不得不暂时停止使用其中一个队列中的MSG。它不一定是动态的。 我没有使用任何自定义ConnectionFactory方法。需要时,我想在application.properties中进行配置更改,以禁用特定的队列消

  • 问题内容: 该规范对于计算CSS具体规定:(粗体雷) 注意:允许重复出现同一 简单选择器 ,并且确实会增加特异性。 因此,例如,具有两倍的特异性比- DEMO 但是,对于“ 简单选择器 ” 一词,规格说明如下:(粗体字) 简单选择器可以是 类型选择 器,也可以是通用选择器,紧随其后的是零个或多个属性选择器,ID选择器或伪类(以任何顺序)。 因此,由于规范说允许重复出现相同的 简单选择器 -这意味着

  • 本文向大家介绍如何做的消息队列选型,为什么选择kafka?相关面试题,主要包含被问及如何做的消息队列选型,为什么选择kafka?时的应答技巧和注意事项,需要的朋友参考一下 kafka和rocketmq吞吐量可达百万级,比activemq、rabbitmq要高一个数量级 kafka和rocketmq都是分布式架构,高可用 kafka和rocketmq都是毫秒级低延时,rocketmq甚至到微秒级 r

  • 问题内容: 您能帮助我了解 无界通配符类型列表 和 原始类型列表 之间的区别吗? 除此之外,有人可以帮助我了解什么是有 界类型参数列表 ? 问题答案: 以下是这三个的摘要: :没有类型参数的列表。它是一个列表,其元素可以是任何类型- 元素可以是不同类型 。 :具有无限制类型参数的列表。它的元素是特定但未知的类型。 元素必须都是相同的类型 。 :带有类型参数称为的列表。所提供的类型必须是extens