haskell - 类型类 101 : GHC too "eager" to derive instance?

标签 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

现在,如果我尝试调用 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/

相关文章:

haskell - 非常简单的代码中的堆栈溢出

animation - Haskell Gloss 没有动画

haskell - 如何编写调用 `run` 或 `runStateT` 的函数 `runReaderT`?

c++ - 单独的 QT 小部件实例

删除所有实例后,Django 模型实例主键不会重置为 1

haskell - "error"函数的存在如何影响 Haskell 的纯度?

haskell - 我不明白列表减法中的类型类约束

python - 同时使用类函数和静态方法? (Python)

java - 在面向对象编程中使用类和实例

python - 使用 boto 从 AWS 实例获取标签