Как динамически вызывать функции с помощью Haskell

Я хочу динамически вызывать функции на основе содержимого, найденного в списке ассоциаций.

Вот пример полупсевдокода. listOfFunctionsбудет передан в 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

Суть вопроса не в переборе списка, а в том, как вызвать функцию, когда я знаю ее имя?

Рассмотрим этот вариант использования для дальнейшего уточнения. Вы открываете командную строку и видите следующее меню.

1: Запись нового файла vHost

2: Выход

Вы записываете новый файл vHost и не видите нового меню

1: Введите новую директиву

2: Запись файла

3: Выход

Вы вводите несколько новых директив для виртуального хоста и теперь готовы записать файл.

Программа не будет слепо писать все возможные директивы, а только те, которые вы указали. Здесь на помощь приходит список ассоциаций. Написание гигантского оператора if/then/else или case — это безумие. Гораздо элегантнее было бы пройтись по списку, посмотреть, какие директивы были добавлены, и вызвать функции, чтобы записать их соответствующим образом.

Следовательно, цикл, найти имя функции, вызвать указанную функцию с предоставленным значением.

Спасибо всем, кто может помочь с этим.

Редактировать:

Вот решение, которое я придумал (конструктивная критика всегда приветствуется).

Я экспортировал функции, которые записывают директивы в список ассоциаций, так как в каждом предоставленном ответе говорилось, что достаточно просто включить функцию.

funcMap = [("writeServerName", writeServerName)
           ,("writeServeralias", writeServerAlias)
           ,("writeDocRoot", writeDocRoot)
           ,("writeLogLevel", writeErrorLog)
           ,("writeErrorPipe", writeErrorPipe)
           ,("writeVhostOpen", writeVhostOpen)]

В файл, который фактически записывает хосты, этот файл импортируется.

У меня есть список ассоциаций с именем hostInfoдля имитации некоторого фиктивного значения, которое будет получено от конечного пользователя, и функция с именем runFunction, которая использует метод, предоставленный edalorzoдля фильтрации обоих списков. Сопоставляя ключи обоих списков, я гарантирую, что правильная функция вызывается с правильным значением.

import Vhost.Directive

hostInfo =     [("writeVhostOpen", "localhost:80")
                ,("writeServerName", "norics.com")] 

runFunctions = [f val | (mapKey, f) <- funcMap, (key, val) <- hostInfo, mapKey == key]
8
задан OpCodeOmega 6 April 2012 в 02:28
поделиться