2

当我遵循它时

print [1..5]

和结果 [1,2,3,4,5]

但为什么以下不起作用

let x = "[1..5]"
print x

我想将字符串变量作为 haskell 命令处理。有人可以帮我吗。

4

3 回答 3

2

请注意,您的第二个示例:

let x = "[1..5]"
print x

工作得很好,它只是说一些与你预期不同的东西。

如果您希望将某个字符串视为有效的 Haskell 表达式,那么您需要通过一些 Haskell 解释器来解释该字符串。最常见的解释器是通过 ghc-api 访问的。ghc-api 的干净包装是hint包。

使用提示的一个简单示例是(通过 ghci):

import Language.Haskell.Interpreter
let x = "[1..5]"
Right result <- runInterpreter $ setImports ["Prelude"] >> eval x
print result

上面的代码将:

  1. hint从包中导入解释器模块
  2. 设置一个字符串,x,这是您想要评估的表达式
  3. 在表达式上运行解释器
  4. 打印结果(这已经是一个字符串,所以您可能更喜欢putStrLn result)。
于 2013-09-08T03:04:06.300 回答
1

如果您只想将列表作为字符串获取,请利用 show 函数

let x = show [1..5]
print x

您的第一个答案“有效”,因为函数应用程序是右关联的,因此 Haskell 评估 [1..5] 以生成列表 [1,2,3,4,5] 并将其传递给 print 函数。

于 2013-09-08T03:46:27.407 回答
0

看起来您正在寻找System.Eval.Haskell.eval或其变体之一。在这种情况下,我相信

import System.Eval.Haskell
do x <- eval "[1..5]" [] :: IO (Maybe Int List)
   putStrLn (if isJust x then "" else show $ fromJust x)

会做你想做的。

于 2013-09-08T02:28:59.643 回答