2012-06-21 16 views
7

Mam problem z uwzględnieniem ukrytych parametrów w Haskell (GHC). Mam funkcji f, który zakłada ukrytą parametr x i chciałby ująć go w kontekście stosując f do gNiejawny parametr i funkcja

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

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

Ale gdy próbuję oceniać

g f 10 

pojawia się błąd, że x nie jest związany, np:

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' 

Czy ktoś może mi powiedzieć, co robię źle?

(Próbuję dostać interfejsu WordNet dla Haskell do pracy - http://www.umiacs.umd.edu/~hal/HWordNet/ - i używa parametrów ukrytych w powyższy sposób, a ja zachować błędów coraz jak ten powyżej, gdy próbuję go skompilować)

Odpowiedz

1

Ten kod działa poprawnie, ale upewnij się, że faktycznie włączyłeś rozszerzenie parametru Implicit Parameter!

Na przykład, w górnej części .hs plik powinien zawierać:

{-# LANGUAGE ImplicitParams #-} 

Albo można użyć flagi -XImplicitParams każdym uruchomieniu GHC.

EDYCJA: Mówisz, że to nie działa?

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 

Jeśli to nie działa, podejrzewam, że masz złą instalację GHC.

+0

Witam, mam '{- # LANGUAGE ImplicitParams # -}' i górę mojego pliku, ale nadal daje ten sam błąd. Jakieś sugestie? PS: Używam GHC ver. 7.4.1 – niklascp

+0

Zobacz moją edycję. Skopiowałem i wkleiłem twój kod i dodałem "JĘZYK", działa dobrze. To powinno działać również dla ciebie. Jeśli to działa, ale twoja rozszerzona sprawa nie ma (HWordNet), to jest to oddzielny problem. –

+0

Cześć, dziękuję za twoją aktualizację - mogę bezbłędnie ocenić 'g (* 3) 4', jednak nie mogę ocenić' g f 4', ponieważ oczekiwałbym, że mógłbym - czy możesz? – niklascp

4

Problem polega na tym, że nie jest związana ?x w punkcie to odwołanie. Ty i ja widzimy, że ?x będzie związany w ramach g, ale kompilator nie może. Jednym z rozwiązań (mylące) jest zmiana

g f 10 

do

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

Pierwszy parametr g musi być typu ((?x::Int) => Int -> Int) wyjaśnić, że? X powinny być przekazywane do f. Może to być możliwe włączenie Rank2Types (lub RankNTypes). Niestety, GHC nie może wnioskować o tym rodzaju.

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

Teraz działa g f 10.

Powiązane problemy