使用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"
问题:
我希望能够在运行时解释任何类型的 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"