我希望能够在运行时解释任何类型的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字符串?
这确实有效-我在原始表达式中犯了一个错误(现已更正)。
答案 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"