Sto cercando di chiamare le funzioni in modo dinamico in base ai contenuti trovati in un elenco di associazioni.Come si chiamano le funzioni in modo dinamico con Haskell
Ecco un esempio in semi-pseudo-codice. listaFunzioni passate a chiamateFunzioni.
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
Il nocciolo della questione non è scorrendo l'elenco, piuttosto, è come chiamare una funzione una volta che ho il suo nome?
Considerare questo caso d'uso per ulteriori chiarimenti. Si apre il prompt dei comandi e viene presentato il seguente menu.
1: Scrivere nuovo file vhost
2: Exit
Si scrive il nuovo file vhost e non viene presentato con un nuovo menu
1: Inserisci nuova direttiva
2: scrittura file
3: uscita
Si entra alcune nuove direttive per il vhost e ora sono pronti per scrivere il file.
Il programma non scriverà ciecamente ogni singola direttiva, anzi, scriverà solo quelli che hai fornito. È qui che entra in gioco l'elenco delle associazioni. Scrivere una gigantesca dichiarazione if/then/else o case è follia. Sarebbe molto più elegante scorrere l'elenco, cercare le direttive aggiunte e chiamare le funzioni per scriverle di conseguenza.
Quindi, loop, trovare un nome di funzione, chiamare detta funzione con il valore fornito.
Grazie a tutti coloro che possono dare una mano.
Edit:
Ecco la soluzione che mi è venuta in mente (critiche costruttive sono sempre i benvenuti).
Ho esportato le funzioni che scrivono le direttive in un elenco di associazioni poiché ogni risposta ha affermato che includere solo la funzione è la strada da percorrere.
funcMap = [("writeServerName", writeServerName)
,("writeServeralias", writeServerAlias)
,("writeDocRoot", writeDocRoot)
,("writeLogLevel", writeErrorLog)
,("writeErrorPipe", writeErrorPipe)
,("writeVhostOpen", writeVhostOpen)]
Nel file che scrive effettivamente gli host, quel file viene importato.
Ho un elenco associazione chiamata hostinfo per simulare un valore fittizio che sarebbero raccolti da un utente finale e una funzione denominata runFunction che utilizza la tecnica forniti dagli edalorzo filtrare attraverso entrambi gli elenchi. Corrispondendo ai tasti di entrambe le liste, mi assicuro che la funzione corretta venga chiamata con il giusto valore.
import Vhost.Directive
hostInfo = [("writeVhostOpen", "localhost:80")
,("writeServerName", "norics.com")]
runFunctions = [f val | (mapKey, f) <- funcMap, (key, val) <- hostInfo, mapKey == key]
So che hai più voti sulla tua risposta, tuttavia, da quando ho finito per usare il codice di edalorzo ho accettato la sua risposta. – OpCodeOmega