【问题标题】:Is the expression (_, 'b') in Normal Form? in Weak Head Normal Form?表达式 (_, 'b') 是范式吗?弱头范式?
【发布时间】:2017-09-01 16:55:41
【问题描述】:

在一本 haskell 编程书籍中完成一个练习,我不确定答案并想检查我的理解。

表达式为:(_, 'b')

这是范式,弱头范式,还是两者都不是?


这是书中列出的问题(#7)的屏幕截图。

【问题讨论】:

  • _ 不是有效的 Haskell 表达式。如果 (_, 'b') 是您在 GHCi 中使用 :sprint 得到的结果,那么那将是 WNHF,因为您知道整个表达式是一个元组,但并不是表达式中的所有内容都被计算。
  • 这真的是书中的问题,还是他们问的是(⊥,'b'),也许写成(_|_,'b')
  • @K.A.Buhr 问题已被编辑,包括书中所列问题的屏幕截图。
  • 我认为 _ 代表尚未评估的内容的占位符。

标签: haskell


【解决方案1】:

不幸的是,作者在这些问题中使用_ 字符是一个错误的决定。正如@Alec 所指出的,代码字符串(_,'b') 不是有效的Haskell 表达式(因为_ 是一个只能出现在模式中的保留标识符),因此询问(_,'b') 是否为正常形式(NF)或弱头范式 (WHNF) 有点像询问大象是处于 NF 还是 WHNF。这真的没有意义。

如果问题改为询问(x, 'b'),那将是一个更好的问题。这是一个有效的 Haskell 表达式。我们可以说它在 WHNF 中,因为它的“头部”(表达式的最外层)是一个数据构造函数。在这种情况下,它是元组构造函数(,),它有一个特殊的语法,所以它比平常不那么明显,但请注意(x, 'b') 可以重写(,) x 'b',这清楚地表明“头”是数据构造函数(,)。但是它不能在 NF 中,因为 x 没有被完全评估(即,没有被它的值替换,可能在别处给出)。

相比之下,(1, 'b') 将在 WHNF 中(因为它的头部是数据构造函数 (,)在 NF 中,因为该数据构造函数完全应用于参数以及这些参数中的每一个已经过全面评估。

现在,我认为作者打算是为了让_ 代表其他有效表达式的一些未指定、未评估的部分,所以他或她想让你推理(_, 'b')在 WHNF 中(因为头部是数据构造函数 (,))但不在 NF 中(因为有一个未评估的部分 _ 浮动)。所以,“正确”的答案是“仅限 WHNF”。

这有帮助吗?

【讨论】:

  • 许多工具(主要是调试器)将未评估的“漏洞”列为_。不过,我确实同意它应该在之前定义过。
  • 您可以自己编写漏洞为_,甚至可以使用-fdefer-typed-holes 运行代码(在这种情况下,它们的行为类似于未定义)。作者可能可以更好地解释他们希望读者如何处理这些练习中的_(我想如果我们考虑它们是键入的孔,那么它们就不能处于正常形式,因为评估它们会爆炸?),但它是(_,'b') 不是一个有效的表达式并不是真的。
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2020-05-20
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2019-08-03
  • 2011-03-08
相关资源
最近更新 更多