动态加载Haskell模块

4
我正在寻找一种方法,可以从字符串中加载Haskell函数并运行。我事先知道类型,但不知道函数的内容。
理想情况下,解决方案应该快速,并且不需要在IO中运行。
我一直在研究hint(Language.Haskell.Interpreter),但它不符合要求(eval调用show,模块必须在文件中)。
非常感谢您的任何帮助。

我已经阅读了https://dev59.com/y3RB5IYBdhLWcg3wH0SW,但并没有得到帮助。 - Alex M
1
你在一个最为静态和注重安全的编程语言中询问 eval 函数吗?多么讽刺啊... - user395760
1
不一定。一个构建纯度和沙盒机制的语言似乎是一个非常适合动态编译的语言。 - Alex M
2个回答

3
hintplugins是主要选择。 hint可以将函数解释为字节码,plugins则使用编译的目标代码。
请注意,由于这些“eval”函数在运行之前必须进行类型检查,因此它们很少是纯值,因为评估可能会因类型错误而失败。

1
提示使用Either类型来编码错误,因此应该能够是纯的。 - Alex M
提示:实际上,这会重新加载所涉及的库和作用域内的模块的整个内容。这需要IO。 - Carl

-1
抽象的答案是,你只需要让 (->) 成为 Read 的一个实例(如果可能的话,也可以加上 Show)。
至于如何做到这一点,我不知道。解释代码并不是一件小事。
如果你正在处理简单的函数,我建议创建一个代数数据类型来表示它们。
data Fun = Add | Subtract | Multiply deriving (Eq, Show, Read)

runFun Add      = (+)
runFun Subtract = (-)
runFun Multiply = (*)

*Main> runFun (read "Add") 2 3
5
*Main> runFun (read "Multiply") 2 3
6
*Main> runFun (read "Subtract") 2 3
-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接