当我遵循它时
print [1..5]
和结果 [1,2,3,4,5]
但为什么以下不起作用
let x = "[1..5]"
print x
我想将字符串变量作为 haskell 命令处理。有人可以帮我吗。
当我遵循它时
print [1..5]
和结果 [1,2,3,4,5]
但为什么以下不起作用
let x = "[1..5]"
print x
我想将字符串变量作为 haskell 命令处理。有人可以帮我吗。
请注意,您的第二个示例:
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
上面的代码将:
hint
从包中导入解释器模块x
,这是您想要评估的表达式putStrLn result
)。如果您只想将列表作为字符串获取,请利用 show 函数
let x = show [1..5]
print x
您的第一个答案“有效”,因为函数应用程序是右关联的,因此 Haskell 评估 [1..5] 以生成列表 [1,2,3,4,5] 并将其传递给 print 函数。
看起来您正在寻找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)
会做你想做的。