小编ftl*_*ftl的帖子

类别101:GHC太"渴望"派生实例?

给出以下代码:

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)

haskell instances

4
推荐指数
1
解决办法
92
查看次数

球拍:评估,命名空间连接模块与命名空间需求

假设我有一个模块“ 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中使用。为什么?

namespaces eval racket

3
推荐指数
1
解决办法
111
查看次数

标签 统计

eval ×1

haskell ×1

instances ×1

namespaces ×1

racket ×1