11

我在考虑 Haskell (GHC) 中的隐式参数时遇到问题。我有一个函数f,它假定隐式参数x,并希望通过将f应用于g将其封装在上下文中

f :: (?x :: Int) => Int -> Int
f n = n + ?x

g :: (Int -> Int) -> (Int -> Int)
g t = let ?x = 5 in t

但是当我尝试评估

g f 10

我收到x未绑定的错误,例如:

Unbound implicit parameter (?x::Int)
  arising from a use of `f'
In the first argument of `g', namely `f'
In the second argument of `($)', namely `g f 10'

谁能告诉我,我做错了什么?

(我正在尝试让 Haskell 的 WordNet 接口工作 - http://www.umiacs.umd.edu/~hal/HWordNet/ - 它以上述方式使用隐式参数,并且我不断收到错误作为当我尝试编译时上面的一个)

4

2 回答 2

8

The first parameter of g must be of type ((?x::Int) => Int -> Int) to clarify that ?x should be passed to f. This can be dony be enabling Rank2Types (or RankNTypes). Unfortunately, GHC cannot infer this type.

{-# LANGUAGE ImplicitParams #-}
{-# LANGUAGE Rank2Types #-}

f :: (?x::Int) => Int -> Int
f n = n + ?x

g :: ((?x::Int) => Int -> Int) -> (Int -> Int)
g f = let ?x = 5 in f`

Now g f 10 works.

于 2013-08-28T12:06:11.743 回答
6

这里的问题是它?x在它被引用的地方没有被绑定。你和我可以看到?x它将被绑定在 内g,但编译器不能。一个(令人困惑的)解决方案是改变

g f 10

g (let ?x = 5 in f) 10
于 2013-05-01T06:45:32.710 回答