给出以下代码:
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
现在,如果我尝试调用 p f,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”,而它必须是类型类 C 的实例。原因是什么?
编辑:我知道我没有为 C 定义任何实例,但“正确的”响应不应该是:
p f :: (C a) => a -> a
最佳答案
当您将纯表达式放入 ghci 时,它基本上是在尝试打印
它,所以
> p f
与文件中包含以下内容大致相同
main :: IO ()
main = print $ p f
正如您所指出的,p f::(C a) => a -> a
。为了打印 $ p f
,GHC 需要评估 p f
。如果不选择传入的字典,GHC 无法使用类型类上下文评估值。为此,它需要为所有 a
找到一个 C a
实例,这不会不退出。它还需要为 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'
关于haskell - 类型类 101 : GHC too "eager" to derive instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590560/