给出以下代码:
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
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试调用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
Run Code Online (Sandbox Code Playgroud)
我觉得有点令人惊讶,因为f只接受一个必须是类型类C的实例的"a".这是什么原因?
编辑:我知道我没有为C定义任何实例,但不应该是"正确的"响应:
p f :: (C a) => a -> a
Run Code Online (Sandbox Code Playgroud) 假设我有一个模块“ foo.rkt”,可导出结构foo,例如,
#lang racket (provide foo) (struct foo ())
Run Code Online (Sandbox Code Playgroud)
在另一个模块中,我使用“ foo.rkt”,但我也想将绑定到“ struct foo”关联到另一个名称空间(出于各种原因,我不使用预制,所以我不能使用名称空间要求) 。
我以为我可以按以下方式使用namespace-attach-module:
(define ns (make-base-namespace))
(namespace-attach-module (current-namespace) "foo.rkt" ns)
(eval '(foo) ns)
Run Code Online (Sandbox Code Playgroud)
但这是行不通的,因为命名空间映射符号显示s在ns中没有绑定(如果这是查找绑定的唯一位置)。但是,它确实可以在REPL中使用。为什么?