Haskell Typeclasses 101:GHC太“了”;热切的;推导实例?

Haskell Typeclasses 101:GHC太“了”;热切的;推导实例?,haskell,instances,Haskell,Instances,给定以下代码: class C a where foo :: a -> a f :: (C a) => a -> a f = id p :: (C a) => (a -> a) -> a -> a p g = foo . g 现在,如果我试图调用pf,GHC会抱怨: > p f No instance for (C a0) arising from a use of `p' In the expression: p f In an equ

给定以下代码:

class C a where
  foo :: a -> a

f :: (C a) => a -> a
f = id

p :: (C a) => (a -> a) -> a -> a
p g = foo . g
现在,如果我试图调用pf,GHC会抱怨:

> p f
No instance for (C a0) arising from a use of `p'
In the expression: p f
In an equation for `it': it = p f
我觉得有点奇怪,因为f只接受一个“a”,它必须是typeclass C的一个实例。原因是什么

编辑:我知道我没有为C定义任何实例,但“正确”的响应不应该是:

p f :: (C a) => a -> a 
这是行动中的恐惧。默认情况下,如果推断的类型具有类约束,GHC不允许我们拥有没有类型注释的顶级值定义。你可以通过以下方法来补救这种情况

a、 )通过在源代码顶部添加
{-#语言NoMonomorphismRestriction}
来关闭限制

b、 )将类型批注添加到受影响的顶级绑定:

foo :: C a => a -> a
foo = p f
c、 )展开函数定义(如果可能):


当您将一个普通表达式放入ghci时,它基本上是试图打印它,所以

> p f
与在文件中包含以下内容大致相同

main :: IO ()
main = print $ p f
正如你所指出的,
pf::(ca)=>a->a
。为了
打印$pf
GHC需要评估
pf
。如果不选择要传入的字典,GHC无法使用类型类上下文计算值。为此,它需要为所有
a
找到一个
ca
实例,该实例不会退出。它还需要为
a->a
找到一个
Show
实例。找不到其中任何一个都会导致两个错误

No instance for (Show (a -> a)) arising from a use of `print'
No instance for (C a) arising from a use of `p'

即使使用
:set-xnomonomomorphismrestriction将裸表达式
pf
输入到ghci中禁用单态限制,也会导致错误
没有(c0)实例。
。我认为这是ghci-7.8试图打印它时产生的伪影。GHCi-7.10根本没有给出错误消息(相反,它抛出了
没有Show…
的实例)。它与打印无关(
pf`seq`()
也给出了一个错误),它也不是真正的MR。更基本的是:如果不选择要传入的字典,GHC无法使用类型类上下文计算值。特别是,无论你如何分割它,它都不知道在这里使用哪种类型的
foo
pf::(C a)=>a->a
是对
:tpf
的正确回答,但是你输入了
pf
。GHCi要问的问题是,“我知道它是
C
的一个实例,但它是哪个实例?否则,我无法确定是否可以
显示它。”
No instance for (Show (a -> a)) arising from a use of `print'
No instance for (C a) arising from a use of `p'