在haskell编程书中练习,我不确定答案,并想检查我的理解。
表达式为:var url = JSON.parse(event.body).article_url;
。
这是正常形式,弱头正常形式,还是两者都没有?
以下是本书中列出的问题(#7)的屏幕截图。
答案 0 :(得分:4)
不幸的是,作者在这些问题中使用_
字符做出了错误的决定。正如@Alec所说,代码字符串(_,'b')
不是有效的Haskell表达式(因为_
是一个只能出现在模式中的保留标识符),因此询问(_,'b')
是否在正常形式(NF)或弱头正常形式(WHNF)有点像询问大象是否在NF或WHNF中。它没有多大意义。
如果问题反而询问了(x, 'b')
,那将是一个更好的问题。这是一个有效的Haskell表达式。我们可以在WHNF中告诉它,因为它的“head”(表达式的最外层)是一个数据构造函数。在这种情况下,它是元组构造函数(,)
,它具有特殊的语法,因此使它比平时稍微不那么明显,但请注意(x, 'b')
可以重写(,) x 'b'
,这使得它变得清晰“head”是数据构造函数(,)
。但它不能在NF中,因为x
没有被完全评估(即,没有被其值替换,这可能是在其他地方给出的。)
相比之下,(1, 'b')
将在WHNF中(因为它的头部是NF中的数据构造函数(,)
)和,因为该数据构造函数完全应用于参数和这些论点中的每一个都已经过充分评估。
现在,我认为作者的意图是_
代表其他有效表达的某些未指明的,未经评估的部分,所以他或她打算让你推理{ {1}}在WHNF中(因为头部是数据构造函数(_, 'b')
)但不在NF中(因为有一个未评估的部分(,)
浮动)。所以,“正确”的答案是“仅限WHNF”。
这有帮助吗?