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

3

问题:

我希望能够在运行时解释任何类型的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()

例子:

如果上面的代码是\() -> "Hello World",那么它可以正常工作。

但是如果代码是下面这样的,我的上面的代码不能正常工作:(更新: 现在可以正常工作)。

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

问题:

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


更新

这是可行的 - 我在原始表达式中犯了一个错误(现已更正)。

1个回答

3

我没有使用过提示,但是我可以告诉你,你的例子不是有效的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"

你说得对!那也是问题所在,使用let语句可以解决,而且还支持多行。太棒了!在Haskell中没有将定义附加到表达式的方法吗? - jundl77
有一个关键字,它就是 letlet:表达式 :: where:定义。你甚至可以在你用 let 做的定义后面加上一个 where 子句(我想)。 - luqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接