打印表达式而不是Haskell中的值

时间:2018-10-21 05:27:14

标签: haskell

我要打印  (1+2) 而不是Haskell中的评估3。我尝试了打印和显示选项,但它仍给出3而不是(1 + 2)。

1 个答案:

答案 0 :(得分:9)

使用Prelude类型,例如IntInteger,这不是您可以做的事情。 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不是一种在运行时保留源表达式表示形式的语言。但这是一种 语言,它为您提供了真正强大的功能来处理新的有趣类型,并且根据您的需求,也许就足够了。