2011-12-19 21 views
6

Me gustaría escribir un módulo que use una función para ser definida por el usuario. Por ejemplo:funciones externas en haskell?

module A 
(someFun) where 

someFun x = doSomethingWith externFun x 

Quisiera externFun a ser definido por el usuario, en el archivo de importación del módulo A. ¿Hay alguna manera? ¿O es solo una mala idea?

Podría, por supuesto, pasar ExternFun como argumento para algunos Fun, pero no parece muy conveniente: la función que se pasará sería la misma para cada llamada a algunos Fun.

+1

Algunos comentarios del downvoter serían de gran ayuda –

Respuesta

8

Las otras respuestas son incorrectas: es es posible! Hay una extensión poco utilizada llamada ImplicitParams hecha exactamente para hacer esto. Por ejemplo:

-- A.hs 
{-# LANGUAGE ImplicitParams #-} 
module A where 
someFun x = ?externFun (?externFun x) 

-- B.hs 
{-# LANGUAGE ImplicitParams #-} 
module B where 
import A 
main = print (someFun 3) where 
    ?externFun = (2*) 

En ghci:

Prelude *B> main 
12 

Voila! Más información en Hugs manual, GHC manual y Implicit Parameters: Dynamic Scoping with Static Types (PDF).

+0

Gracias. ¿Es una buena manera de irse? ¿Hay desventajas de usarlo al pasar la función como parámetro (en términos de diseño o eficiencia)? –

+0

@flagadabla Creo que no es muy común, pero no conozco ningún problema de diseño o eficiencia del que tenga cuidado al compararlo con una función explícita. –

0

No, deberías tomar es como argumento. ¿Por qué crees que sería lo mismo para cada llamada? Funciona como cualquier otro argumento.

6

No, no puedes hacer esto. Pasarlo como argumento es el camino a seguir. Sin embargo, puede eliminar la repetición mediante el uso de una aplicación parcial. Sólo hacer algo como esto en el otro módulo:

import A (someFun) 
someFun' = someFun externFun 

Ahora puede utilizar someFun' todas partes en su lugar.

Cuestiones relacionadas