使用Haskell在运行时解释多行代码字符串

Using Haskell to interpret multi-line strings of code at runtime

问题:

我希望能够在运行时解释任何类型的 Haskell 代码 - 也包括不受一行限制的代码。

现在我正在使用 hint 在下面执行此操作,它适用于单行:

html :: String -> IO String
html code = do    
    r <- runInterpreter $ do
        setImports ["Prelude"]
        interpret code (as :: () -> String)

    case r of
        Left err -> return $ show err
        Right func -> return $ func()

示例:

如果上面的 code\() -> "Hello World" 就可以了。

但是如果 code 是下面这样的,我上面的代码不起作用: (Update: 它确实)。

\() -> let concatString :: String -> String -> String
           concatString str1 str2 = str1 ++ str2
       in concatString "Hello" "World"

问题:

如何使用提示或任何其他库在运行时解释多行 Haskell 字符串?


更新

这确实有效 - 我在原始表达式中犯了一个错误(我现在已更正)。

我没有使用过提示,但我可以告诉您您的示例不是有效的 Haskell 表达式。 where 子句不附加到表达式,它们附加到 定义 。也就是说,你必须有一个 = 符号才能有一个 where 子句。

-- Correct
foo = bar
    where
    bar = baz
        where 
        baz = 42

-- Incorrect
foo = (bar + 1 where bar = 41)

如果您想在表达式上下文中定义某些内容,则必须使用 let

let concatString :: String -> String -> String
    concatString str1 str2 = str1 ++ str2
in concatString "Hello" "World"