Haskell 中等效于 Python eval 的方法

13 投票
7 回答
4395 浏览
提问于 2025-04-15 20:33

在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包。

12

它没有内置的 eval 函数。不过在 hackage 上有一些包可以实现类似的功能,具体可以查看这个链接。还有一个感谢 @luqui 的包叫做 hint,可以用来做这方面的事情,详细信息可以参考这个文档

26

在Haskell中,和Java、C++等类似的语言一样,你确实可以调用编译器,然后动态加载代码并执行它。不过,这种做法通常比较复杂,几乎不是人们在其他语言中使用eval()的原因。

人们使用eval()的原因是,在某些特定类型的问题上,利用该语言的特性,从程序输入中构建一个看起来像该语言的字符串,比直接解析和计算输入要简单得多。

举个例子,如果你想让用户在输入框中不仅能输入数字,还能输入简单的算术表达式,那么在Perl或Python中,直接对输入调用eval()会比为你想允许的表达式语言写一个解析器简单得多。不幸的是,这种做法几乎总是会导致用户体验不佳(编译器的错误信息并不是为非程序员设计的),而且还会带来安全隐患。解决这些问题而不使用eval()通常需要写很多代码。

在Haskell中,得益于像Parsec这样的工具,实际上编写一个解析器和计算器来处理这些输入问题是非常简单的,这大大减少了对eval的需求。

撰写回答