Haskell 中等效于 Python eval 的方法
在Python中,有一个叫做eval
的函数,它可以接收字符串作为输入,然后对这个字符串进行计算和执行。
>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>
那么,Haskell中有没有和eval
函数相同功能的东西呢?
7 个回答
11
这个语言里没有内置的'eval'功能,不过Template Haskell可以在编译时进行计算。
如果你想要在运行时使用'eval',也就是在程序运行时进行元编程,有很多在Hackage上可以找到的包,它们基本上是导入了GHC或GHCi,包括旧的hs-plugins包和hint包。
26
在Haskell中,和Java、C++等类似的语言一样,你确实可以调用编译器,然后动态加载代码并执行它。不过,这种做法通常比较复杂,几乎不是人们在其他语言中使用eval()
的原因。
人们使用eval()
的原因是,在某些特定类型的问题上,利用该语言的特性,从程序输入中构建一个看起来像该语言的字符串,比直接解析和计算输入要简单得多。
举个例子,如果你想让用户在输入框中不仅能输入数字,还能输入简单的算术表达式,那么在Perl或Python中,直接对输入调用eval()
会比为你想允许的表达式语言写一个解析器简单得多。不幸的是,这种做法几乎总是会导致用户体验不佳(编译器的错误信息并不是为非程序员设计的),而且还会带来安全隐患。解决这些问题而不使用eval()
通常需要写很多代码。
在Haskell中,得益于像Parsec这样的工具,实际上编写一个解析器和计算器来处理这些输入问题是非常简单的,这大大减少了对eval
的需求。