Estoy buscando llamar funciones dinámicamente en función de los contenidos encontrados en una lista de asociación.Cómo llama funciones dinámicamente con Haskell
Aquí hay un ejemplo en semi-pseudo-código. listOfFunctions pasará a callFunctions.
listOfFunctions = [('function one', 'value one')
, ('function two', 'value two')
, ('function three', 'value three')]
callFunctions x = loop through functions
if entry found
then call function with value
else do nothing
El quid de la cuestión no es un bucle a través de la lista, más bien, es la forma de llamar a una función una vez que tenga su nombre?
Considere este caso de uso para mayor aclaración. Abre el símbolo del sistema y aparece el siguiente menú.
1: Escribir nuevo archivo de host virtual
2: Salir
Usted escribe el nuevo archivo de host virtual y no se presentan con un nuevo menú
1: Introducir la nueva Directiva
2: Escribir archivo
3: Salir
Se introduce algunas nuevas directrices para el host virtual y ahora está listo para escribir el archivo.
El programa no va a escribir ciegamente todas y cada una de las directivas que pueda, sino que solo escribirá las que usted suministró. Aquí es donde entra en juego la lista de asociaciones. Escribir una declaración gigante de si/entonces/otro o caso es una locura. Sería mucho más elegante recorrer la lista, buscar qué directivas se agregaron y llamar a las funciones para escribirlas en consecuencia.
Por lo tanto, buclee, busque un nombre de función, llame a dicha función con el valor suministrado.
Gracias a todos los que pueden ayudar con esto.
Editar:
Aquí está la solución que yo he llegado con (críticas constructivas siempre son bienvenidos).
Exporté las funciones que escriben las directivas en una lista de asociaciones, ya que cada respuesta proporcionada decía que incluir la función es el camino a seguir.
funcMap = [("writeServerName", writeServerName)
,("writeServeralias", writeServerAlias)
,("writeDocRoot", writeDocRoot)
,("writeLogLevel", writeErrorLog)
,("writeErrorPipe", writeErrorPipe)
,("writeVhostOpen", writeVhostOpen)]
En el archivo que realmente escribe los hosts, ese archivo se importa.
I tiene una lista de asociación llamada hostinfo para simular algunos valor ficticio que se desprende de un usuario final y una función llamada runFunction que utiliza la técnica suministrado por edalorzo filtrar a través de ambas listas. Al hacer coincidir las teclas de ambas listas, me aseguro de que se llame a la función correcta con el valor correcto.
import Vhost.Directive
hostInfo = [("writeVhostOpen", "localhost:80")
,("writeServerName", "norics.com")]
runFunctions = [f val | (mapKey, f) <- funcMap, (key, val) <- hostInfo, mapKey == key]
Sé que tienes más votos en tu respuesta, sin embargo, desde que terminé usando el código de edalorzo, acepté su respuesta. – OpCodeOmega