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