python中有一个名为eval
的函数,它接受字符串输入并对其进行求值。
>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>
什么是Haskell相当于eval
函数?
答案 0 :(得分:25)
确实,在Haskell中,如在Java或C ++或类似语言中,可以调用编译器,然后动态加载代码并执行它。但是,这通常很重,而且几乎不会让人们在其他语言中使用eval()
。
人们倾向于在语言中使用eval()
,因为考虑到语言的设施,对于某些类别的问题,从类似于语言本身的程序输入构造字符串更容易,而不是解析和评估直接输入。
例如,如果您想允许用户不仅输入输入字段中的数字,而且输入简单的算术表达式,在Perl或Python中,只需在输入上调用eval()
就可以了。为您想要允许的表达式语言编写解析器。不幸的是,这种方法几乎总是导致整体用户体验不佳(编译器错误消息不适用于非程序员)并打开安全漏洞。在不使用eval()
的情况下解决这些问题通常需要相当多的代码。
在Haskell中,感谢Parsec之类的东西,为这些输入问题编写解析器和求值器实际上非常容易,并且大大消除了对eval
的渴望。
答案 1 :(得分:12)
它没有内置的eval功能。但是有一些关于hackage that can do the same sort of thing的软件包。 (docs)。感谢@luqui,还有hint。
答案 2 :(得分:10)
虽然Template Haskell允许编译时评估,但语言中没有内置'eval'。
对于运行时'eval' - 即运行时元编程 - Hackage上有许多包基本上导入GHC或GHCi,包括旧的hs-plugins包和提示包。
答案 3 :(得分:3)
答案 4 :(得分:1)
没有等效的eval,Haskell是一种静态编译的语言,与C或C ++相同,也没有eval。