如何使用Haskell动态调用函数

OpC*_*ega 8 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
Run Code Online (Sandbox Code Playgroud)

这个问题的关键不在于循环列表,而是一旦我有了它的名字,它就是如何调用函数的?

考虑此用例以进一步说明.您打开命令提示符并显示以下菜单.

1:编写新的vHost文件

2:退出

您编写新的vHost文件,但未显示新菜单

1:输入新指令

2:写文件

3:退出

您为vHost输入一些新指令,现在可以编写该文件了.

程序不会盲目地写出它可能的每一个指令,而是只编写你提供的指令.这是关联列表的用武之地.编写一个巨大的if/then/else或case语句是疯狂的.循环遍历列表,查找添加了哪些指令并调用函数来相应地编写它们会更加优雅.

因此,循环,找到一个函数名,用提供的值调用所述函数.

感谢任何可以帮助解决这个问题的人.

编辑:

这是我提出的解决方案(建设性批评总是受欢迎的).

我导出了在关联列表中编写指令的函数,因为每个提供的答案都表示只包含函数是要走的路.

funcMap = [("writeServerName", writeServerName)
           ,("writeServeralias", writeServerAlias)
           ,("writeDocRoot", writeDocRoot)
           ,("writeLogLevel", writeErrorLog)
           ,("writeErrorPipe", writeErrorPipe)
           ,("writeVhostOpen", writeVhostOpen)]
Run Code Online (Sandbox Code Playgroud)

在实际写入主机的文件中,导入该文件.

我有一个名为hostInfo的关联列表来模拟将从最终用户收集的一些虚拟值和一个名为runFunction的函数,该函数使用edalorzo提供的技术来过滤这两个列表.通过匹配两个列表的键,我确保使用正确的值调用正确的函数.

import Vhost.Directive

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

runFunctions = [f val | (mapKey, f) <- funcMap, (key, val) <- hostInfo, mapKey == key]
Run Code Online (Sandbox Code Playgroud)

ehi*_*ird 16

您可以直接在列表中包含该功能; 函数是值,因此您可以在列表中按名称引用它们.一旦你将它们从列表中删除,应用它们就像这样简单func value.根本不需要涉及他们的名字.


Edw*_*rzo 8

因为我对Haskell很新,所以我会冒你认为我的建议非常幼稚的风险,但无论如何它在这里:

let funcs = [("sum", (+3),1),("product", (*3),2),("square", (^2),4)]
[f x | (name, f, x) <- funcs, name == "sum"]
Run Code Online (Sandbox Code Playgroud)

我认为它满足了问题的要求,但也许你想要的更加软化,而不是我对Haskell的限制性知识所能看到的.