Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 有没有办法追踪重叠的实例决策_Haskell_Ghc - Fatal编程技术网

Haskell 有没有办法追踪重叠的实例决策

Haskell 有没有办法追踪重叠的实例决策,haskell,ghc,Haskell,Ghc,在实例重叠的情况下,是否可能知道(在编译时)编译器选择了哪个实例 人为的例子 {-# LANGUAGE IncoherentInstances #-} class Transformable a b where transform :: a -> b instance Transformable a Int where transform _ = 17 instance a ~ b => Transformable a b where transform x =

在实例重叠的情况下,是否可能知道(在编译时)编译器选择了哪个实例

人为的例子

{-# LANGUAGE IncoherentInstances #-}


class Transformable a b where
  transform :: a -> b

instance Transformable a Int where
  transform _ = 17

instance a ~ b => Transformable a b where
  transform x = x
transform(1::Int)的结果是什么::Int
?(1或17) 有没有办法知道何时实例化
可转换Int
编译器选择实例1还是实例2?
当没有重叠但实例化链很复杂时,它有时也很有用。

您可以始终使用
调试。跟踪

import Debug.Trace
...

instance Transformable a Int where
  transform _ = trace "using Int definition" 17

instance a ~ b => Transformable a b where
  transform x = trace "using a ~ b definition" x

看看GHC核心。使用
-ddump siml
并搜索字典参数。我很好奇。
a~b=>Transformable a b
Transformable a a
之间有什么区别?我不确定在这种情况下是否需要它。我简化了需要它的代码。有一个很好的解释@chi
-ddump siml
确实给出了一些东西,但它非常不透明。你能给我一个关于寻找什么的提示吗?OP问:“有可能知道(在编译时)…”我这样做了,这确实是一个问题。但我很想知道在编译时是否有可以看到的魔旗+1无论如何