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无论如何