在求解离散数学的程序中,我想让用户输入一串逻辑操作;例如,如果用户输入let f (x:y:_) = x && y,那么我将得到一个函数f,以便在程序的其余部分中使用。在GHCi中,我可以通过输入let f (x:y:_) = x && y轻松地测试我的程序。
我不知道如何完成这项任务。我已经从eval包中查看了plugins函数,但它似乎不是正确的函数。我能在Haskell做这个吗?
我计划对此使用的代码是:
type TruthTable = [[Bool]]
type TruthTableResult = [([Bool], Bool)]
solveTable :: ([Bool] -> Bool) -> Integer -> (TruthTableResult)
solveTable f n = let table = truthTable n
result = map f table
in zipWith (\v r -> (v, r)) table result发布于 2013-09-16 07:33:04
没有标准的Haskell函数,因为Haskell是被遵从的,而不是解释的。但是,有些库允许您在运行时读取和编译Haskell代码。其中一个是提示。例如,您的案例:
import Control.Monad
import Language.Haskell.Interpreter
main = do
-- fExpr is a Haskell code supplied by your user as a String
let fExpr = "let f (x:y:_) = x && y in f"
-- Create an interpreter that runs fExpr
r <- runInterpreter $ do
setImports ["Prelude"]
interpret fExpr (const True :: [Bool] -> Bool)
-- run it and get an interface to the function
case r of
Left err -> putStrLn $ "Ups... " ++ (show err)
Right f -> do
print $ f [True, False]
print $ f [True, True]更多可用的示例这里。
发布于 2013-09-16 07:19:47
您正在编写一个eval函数--一种运行时元编程的形式。
eval :: String -> a如果该字符串表示Haskell程序,则必须解析该字符串,键入check,然后将其编译到目标解释器或运行时。这需要以库的形式访问编译器,或者作为运行时服务导出(在解释器中),或者作为单独的包(如编译器)。
Haskell的GHC实现有几个库,用于对Haskell代码进行运行时评估:
这些只适用于您的输入语言是Haskell。
如果您的输入字符串以其他语言表示程序,那么您正在寻找DSL解释器。这可以通过为输入语言编写自己的解释器来实现(如果库是公共语言,则重用它)。
发布于 2013-09-16 06:26:32
简单的回答是,Haskell没有"eval“函数,不像解释语言可以很容易地做到这一点(毕竟,它们有现成的解释器,并且已经在运行)。
您可以将Haskell编译器作为库包括在内:请参阅图书馆。这是最接近你要求的东西。
然而,听起来你不需要整个Haskell;你真正想要的是一种不同的语言,它可能有类似Haskell的语法,但不是Haskell的整体。如果是这样,那么真正的解决方案就是定义该语言并为其编写一个解析器。帕秒库就是这方面的起点。
https://stackoverflow.com/questions/18821097
复制相似问题