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

时间:2019-01-12 01:09:13

标签: haskell hint

问题:

我希望能够在运行时解释任何类型的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如下所示,我上面的代码不起作用:(更新:可以)

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

问题:

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


更新

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

1 个答案:

答案 0 :(得分:3)

我没有使用提示,但是我可以告诉您,您的示例不是有效的Haskell表达式。 where子句未附加到表达式,它们已附加到 definitions 。也就是说,必须具有=符号才能具有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"