Debugging 如何调试类型级程序

Debugging 如何调试类型级程序,debugging,haskell,types,Debugging,Haskell,Types,我正在尝试做一些hoopy类型的编程,但它就是不起作用。我拼命想弄明白为什么该死的GHC完全无法推断出我想要的类型签名 有没有办法让GHC告诉我它在做什么 我尝试了-ddump tc,它只打印出最终的类型签名。(是的,他们错了。谢谢,我已经知道了。) 我还尝试了-ddump tc trace,它会转储约70KB的无法理解的胡言乱语。(特别是,我看不到任何地方提到的用户编写的标识符。) 我的代码几乎可以正常工作,但不知怎么的,一个额外的类型变量不断出现。出于某种原因,GHC看不出这个变量应该完全确

我正在尝试做一些hoopy类型的编程,但它就是不起作用。我拼命想弄明白为什么该死的GHC完全无法推断出我想要的类型签名

有没有办法让GHC告诉我它在做什么

我尝试了
-ddump tc
,它只打印出最终的类型签名。(是的,他们错了。谢谢,我已经知道了。)

我还尝试了
-ddump tc trace
,它会转储约70KB的无法理解的胡言乱语。(特别是,我看不到任何地方提到的用户编写的标识符。)


我的代码几乎可以正常工作,但不知怎么的,一个额外的类型变量不断出现。出于某种原因,GHC看不出这个变量应该完全确定。事实上,如果我手动编写五英里类型的签名,GHC会欣然接受。很明显,我只是缺少了一个约束。。。但是在哪里?!>_ 正如在评论中提到的,用:kind和:kind戳来戳去!在GHCi中,我通常是这样做的,但令人惊讶的是,函数放置在何处也很重要,看起来应该是一样的东西并不总是一样的

例如,我试图为一个个人项目创建一个独立类型的函子等价物,它看起来像

class IFunctor f where 
  ifmap :: (a -> b) -> f n a -> f n b 
我正在为你写这个例子

data IEither a n b where 
  ILeft :: a -> IEither a Z b 
  IRight :: b -> IEither a (S n) b 
它应该相当简单,我想,忽略左边的f,在右边应用它

我试过了

instance IFunctor (IEither a) where
  ifmap _ l@(ILeft _) = l 
  ifmap f (IRight r) = IRight $ f r
但是对于本例中的ifmap的专用版本是
ifmap::(b->c)->Iither a Z b->Iither a Z c
,Haskell推断l的类型在LHS上是
Iither a Z b
,这是有意义的,但随后拒绝生成
b~c

因此,我必须展开l,得到类型a的值,然后重新包装它,得到
,即a Z c

这不仅适用于依赖类型,也适用于rank-n类型。 例如,我试着将一种适当形式的同构转换成自然变换,我想这应该相当容易


显然,我必须将解构器放在函数的where子句中,因为否则类型推断无法正常工作

你应该至少发布一些代码。据我所知,类型级程序最好用
:kind调试、孔和
任何
作为类型级别的孔。我的代码既大又复杂,我怀疑任何人都能理解它。我想要的是关于如何找出问题所在的提示,这样我就知道从哪里开始寻找。这条评论只是为了让我有可能说“我找到了!”后来:你认为某种类型的家族是内射的吗?@Cactus LOL!我有GADT,存在量化,秩N类型和重叠实例。。。但是没有类型家庭。嘿,值得一试:)