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

使用GHCi展开类型同义词、类型族

丌官积厚
2023-03-14

我想知道GHCi中(或其他地方)是否存在将类型同义词和族扩展出任意类型表达式的功能。

data A = A
data B = B

data F a = F a
data G a = G a
data H a b = H a b

type S a b = H (F a) (G b)
type T a = S (a) (H B a)

type family R a :: *
type instance R (H a b) = H b a
> :t undefined :: T (S B A)
undefined :: T (S B A) :: T (S B A)

> :texpand undefined :: T (S B A)
undefined :: T (S B A) :: H (F ((H (F B) (G A)))) (G (H B (H (F B) (G A))))

> :texpand undefined :: R (T (S B A))
undefined :: R (T (S B A)) :: H (G (H B (H (F B) (G A)))) (F ((H (F B) (G A)))) 

共有1个答案

云鸿达
2023-03-14

:kind!执行此操作:

λ> :kind! T (S B A)
T (S B A) :: *
= H (F (H (F B) (G A))) (G (H B (H (F B) (G A))))
λ> :kind! R (T (S B A))
R (T (S B A)) :: *
= H (G (H B (H (F B) (G A)))) (F (H (F B) (G A)))

(为了方便起见,您可以在.ghci中放入类似:def k!\x->return(“:kind!”++x)的内容。)

 类似资料:
  • 我正在编写一个实现一些程序分析的Java程序。作为这一点的一部分,我想要一种类型来表示我正在分析的程序中的“值”。在我看来,值只是整数。然而,我宁愿不在代码中使用/类型,因为/不是一个非常描述性的名称。我宁愿写。然后我想写 然后完成。但这不起作用,因为<code>Integer</code>是最终类。因此,我当前的解决方案是给类一个字段,然后手动实现所有各种标准方法: 当我真的只是在寻找行为类似于

  • 模板Haskell能找出类型类中声明的关联类型同义词的名称和/或声明吗?我希望能做我想做的事情,但它似乎没有提供所有必要的信息。它用于获取函数类型签名: 但是,将关联的类型同义词添加到类中不会导致输出中的更改(直到重命名):

  • 以下代码不能按预期工作。显然,我不能在类定义中使用类自己的类型: 运行它的结果是: 此外,使用检查代码会返回: 如何将此代码更正为对Python和mypy有效?

  • JLS 8.1.3就是这样定义词汇封闭类型概念的: 类或接口O是其自身的第0个词汇封闭类型声明。 类O是类C的第n个词汇封闭类型声明,如果它是C的第n-1个词汇封闭类型声明的直接封闭类型声明。 因此,从这个定义中不清楚是否考虑了任何内部类,或者仅仅是类或接口O的内部类。这些是不同的概念,因为最后一个定义如下: 如果O是C的直接封闭类型声明,并且C的声明不在静态上下文中出现,则内部类C是类或接口O的

  • 我想基于泛型值返回不同的类型。例如: 但我有一个错误: 类型字符串[]不能分配给类型T扩展Base?String[]:字符串

  • 如何将此迭代器与泛型类型一起使用?以下是我在“main”函数中尝试的方法: 结果是:<代码>无法从静态上下文引用非静态类项 结果是:<代码>无法从静态上下文引用非静态类项 结果: 编辑: 我调用的是类而不是方法。这项工作: 迭代器it=deq。迭代器(); 我认为,由于iterator()中返回的实例的类型是ListIterator,因此我需要使用该类型声明“it”。