首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以通过计算字符串在运行时创建函数吗?

可以通过计算字符串在运行时创建函数吗?
EN

Stack Overflow用户
提问于 2013-09-16 05:44:58
回答 3查看 1.6K关注 0票数 9

在求解离散数学的程序中,我想让用户输入一串逻辑操作;例如,如果用户输入let f (x:y:_) = x && y,那么我将得到一个函数f,以便在程序的其余部分中使用。在GHCi中,我可以通过输入let f (x:y:_) = x && y轻松地测试我的程序。

我不知道如何完成这项任务。我已经从eval包中查看了plugins函数,但它似乎不是正确的函数。我能在Haskell做这个吗?

我计划对此使用的代码是:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-16 07:33:04

没有标准的Haskell函数,因为Haskell是被遵从的,而不是解释的。但是,有些库允许您在运行时读取和编译Haskell代码。其中一个是提示。例如,您的案例:

代码语言:javascript
复制
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]

更多可用的示例这里

票数 15
EN

Stack Overflow用户

发布于 2013-09-16 07:19:47

您正在编写一个eval函数--一种运行时元编程的形式。

代码语言:javascript
复制
eval :: String -> a

如果该字符串表示Haskell程序,则必须解析该字符串,键入check,然后将其编译到目标解释器或运行时。这需要以库的形式访问编译器,或者作为运行时服务导出(在解释器中),或者作为单独的包(如编译器)。

Haskell的GHC实现有几个库,用于对Haskell代码进行运行时评估:

  • 通过GHCi解释器- 提示
  • 通过编译器- 插件

这些只适用于您的输入语言是Haskell。

如果您的输入字符串以其他语言表示程序,那么您正在寻找DSL解释器。这可以通过为输入语言编写自己的解释器来实现(如果库是公共语言,则重用它)。

票数 10
EN

Stack Overflow用户

发布于 2013-09-16 06:26:32

简单的回答是,Haskell没有"eval“函数,不像解释语言可以很容易地做到这一点(毕竟,它们有现成的解释器,并且已经在运行)。

您可以将Haskell编译器作为库包括在内:请参阅图书馆。这是最接近你要求的东西。

然而,听起来你不需要整个Haskell;你真正想要的是一种不同的语言,它可能有类似Haskell的语法,但不是Haskell的整体。如果是这样,那么真正的解决方案就是定义该语言并为其编写一个解析器。帕秒库就是这方面的起点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18821097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档