我要打印
(1+2)
而不是Haskell中的评估3。我尝试了打印和显示选项,但它仍给出3而不是(1 + 2)。
答案 0 :(得分:9)
使用Prelude
类型,例如Int
或Integer
,这不是您可以做的事情。 Haskell不是一种在运行时保留表达式的语言。但是Haskell确实使数字文字多态,并且您始终可以创建确实使表达式保持 some 表示形式的数据类型。
或者您可以使用可以完成所有操作的库。 simple-reflect就是这样做的。
Prelude Debug.SimpleReflect.Expr> 1 + 2 :: Expr
1 + 2
Prelude Debug.SimpleReflect.Expr> (1 + 2) * 3 :: Expr
(1 + 2) * 3
请注意,它基于实现所有数字类型类操作而不是文本分析来工作。例如,它执行自己的漂亮打印:
Prelude Debug.SimpleReflect.Expr> 1 + (2 * 3) :: Expr
1 + 2 * 3
看看它是怎么丢掉那里的人的?那是因为它们是多余的,并且不需要它们就可以漂亮地打印出相同的表达式。
即使朝着这个方向发展,不属于数字类型类的操作也不会以Expr
类型表示,因此您将得到如下信息:
Prelude Debug.SimpleReflect.Expr> foldl (+) 0 [1..5] :: Expr
0 + 1 + 2 + 3 + 4 + 5
foldl
是完整评估的,而不是象征性地保留。这是因为foldl
在任何数字类型类中都不是操作,因此Expr
不能有任何实例来保存它。
所以-通常来说,不可能。 Haskell不是一种在运行时保留源表达式表示形式的语言。但这是一种 语言,它为您提供了真正强大的功能来处理新的有趣类型,并且根据您的需求,也许就足够了。