haskell - 使用字符串内容调用同名函数

标签 haskell eval

我有一个如下所示的主要内容:

main :: IO ()
main = do
  args <- getArgs
  putStrLn $ functionName args
  where 
    functionName args = "problem" ++ (filter (/= '"') $ show (args!!0))

我不想像现在那样将名称放入标准输出,而是想调用该函数。

我知道我可以使用提示(如 Haskell: how to evaluate a String like "1+2" 中提到的),但我认为这对于获取简单的函数名称来说有点过分了。

现阶段如果函数不存在,程序崩溃也没关系!

最佳答案

如果不采取特殊措施来保存它们,函数名称可能会在编译后的 Haskell 程序中完全消失。

我建议只制作一张大的顶级 map :

import Data.Map ( Map )
import qualified Data.Map as Map

functions :: Map String (IO ())
functions = Map.fromList [("problem1", problem1), ...]

call :: String -> IO ()
call name =
    case Map.lookup name of
        Nothing -> fail $ name + " not found"
        Just m -> m

main :: IO ()
main = do
  args <- getArgs
  call $ functionName args
  where 
    functionName args = "problem" ++ (filter (/= '"') $ show (args!!0))

关于haskell - 使用字符串内容调用同名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121918/

相关文章:

arrays - 无需评估即可动态创建结构数组

haskell - 在 Haskell 中,有没有写 num to num 转换函数 `toNum::(Num a, Num b) => a -> b` 的好方法?

使用解析器组合器解析具有函数应用的表达式语法(左递归)

haskell - 我怎样才能体面地将 "undo"功能添加到状态单子(monad)?

csv - 在 Haskell 中解析 CSV/TSV 文件 - Unicode 字符

haskell - 如何求和{getSum = 0}?

python - 为什么 ast.literal_eval ('5 * 7' ) 失败了?

Javascript:如何使用 eval 返回或解析对象文字?

python - 如何执行存储为字符串的 bool 逻辑,最好不使用 eval()?

bash - 检查具有动态名称的 Bash 变量