2012-06-21 77 views
7

考慮到Haskell(GHC)中的隱式參數,我有一個問題。我有一個函數˚F,即假設隱含參數X,並想通過應用F到封裝它在上下文隱式參數和函數

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' 

有人可以告訴我,我做錯了什麼?

(我試圖讓WordNet的接口Haskell的工作 - http://www.umiacs.umd.edu/~hal/HWordNet/ - 它使用在上述方式隱含參數,和我不斷收到錯誤,作爲一個以上,當我嘗試編譯)

回答

1

此代碼正常工作,但請確保實際啓用了隱式參數的擴展!

例如,在你的開發文件的頂部文件,你應該包括:

{-# LANGUAGE ImplicitParams #-} 

或者你可以使用-XImplicitParams標誌每次運行時GHC。

編輯:你是說這不適合你?

dyn-40-155:Test tommd$ cat so.hs 
{-# LANGUAGE ImplicitParams #-} 

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

g :: (Int -> Int) -> (Int -> Int) 
g t = let ?x = 5 in t 
dyn-40-155:Test tommd$ ghci so.hs 
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-simple ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (so.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> g (*3) 4 
12 

如果不工作,那麼我懷疑你有一個壞的安裝GHC的。

+0

嗨,我有'{ - #LANGUAGE ImplicitParams# - }'我是我的文件的頂部,但它仍然產生相同的錯誤。有什麼建議麼? PS:我使用GHC版本。 7.4.1 – niklascp

+0

看我的編輯。我複製並粘貼你的代碼並添加'LANGUAGE'編譯指示,工作正常。它也應該適合你。如果這個工作正常,但你擴大的案例不(HWordNet),那麼這是一個單獨的問題。 –

+0

嗨,感謝您的更新 - 我可以評估'g(* 3)4'沒有問題,但我無法評估'g f 4',因爲我期望我能 - 你能嗎? – niklascp

4

這裏的問題是,?x未被引用的點綁定。你和我可以看到?x將被綁定在g之內,但是編譯器不能。酮(混亂)的解決方案是改變

g f 10 

g (let ?x = 5 in f) 10 
5

g第一個參數必須是((?x::Int) => Int -> Int)類型的澄清,?x應被傳遞到f。這可以使Rank2Types(或RankNTypes)成爲可能。不幸的是,GHC不能推斷出這種類型。

{-# 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` 

現在g f 10的作品。