在我的离散数学求解程序中,我想让用户输入一串逻辑运算。例如,如果用户输入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
没有标准的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]
此处提供更多示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句