11 votes

Paramètre et fonction implicites

J'ai un problème avec les paramètres implicites en Haskell (GHC). J'ai une fonction f qui suppose le paramètre implicite x et souhaite l'encapsuler dans un contexte en appliquant la méthode f à g

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

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

Mais lorsque j'essaie d'évaluer

g f 10

Je reçois l'erreur suivante x n'est pas liée, par exemple :

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'

Quelqu'un peut-il me dire ce que je fais de travers ?

(J'essaie de faire fonctionner l'interface WordNet pour Haskell - http://www.umiacs.umd.edu/~hal/HWordNet/ - et il utilise des paramètres implicites de la manière décrite ci-dessus, et je continue à obtenir des erreurs comme celle ci-dessus lorsque j'essaie de le compiler)

8voto

real-or-random Points 211

Le premier paramètre de g doit être du type ((?x::Int) => Int -> Int) pour préciser que ?x doit être transmis à f . Ceci peut être fait en activant Rank2Types (ou RankNTypes). Malheureusement, GHC ne peut pas déduire ce 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`

Ahora g f 10 œuvre.

6voto

jekor Points 372

Le problème est que ?x n'est pas lié au moment où il est référencé. Vous et moi pouvons voir que ?x sera lié à l'intérieur de g mais le compilateur ne le peut pas. Une solution (déroutante) consiste à modifier

g f 10

à

g (let ?x = 5 in f) 10

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X