2

到这里一半...

https://en.wikibooks.org/wiki/Haskell/Laziness

...是一个练习,询问更改head使用无可辩驳的模式的功能的替代实现的影响。它提供了如下定义,注意由于第一个方程的无可辩驳的匹配head',它总是会返回:undefined

head' :: [a] -> a
head' ~[]     = undefined
head' ~(x:xs) = x

然后它问:

  • 为什么不改变方程的顺序来head'帮助这里?
  • 如果将第一个等式更改为使用普通的可反驳模式,那么 的行为head'仍然会与 的行为不同head吗?如果是这样,怎么做?

在 GHC 7.8.4 中,似乎更改顺序“有助于”至少使该函数的行为类似于 的常规部分版本head,尽管在空列表情况下有不同的例外。在我看来,第二个问题的答案是“否”,但考虑到“如果是这样,如何”附录,感觉我在这里也必须遗漏一些东西。任何人都可以启发我吗?不幸的是,页面上的解决方案链接不包括此练习。

4

1 回答 1

7

我不确定维基手册中的“帮助”是什么意思。您是正确的,更改顺序将使其行为本质上与正常的head. 同样,您是正确的,使第一个模式可反驳也会使其表现得像head. 我要说这些问题很混乱;他们绝对令人困惑。

我们可以通过计算(包括用 GHC 计算)来验证这些答案:

head [] = ⊥
head (x:xs) = x
head ⊥ = ⊥

head' [] = ⊥
head' (x:xs) = ⊥
head' ⊥ = ⊥

head1 [] = ⊥
head1 (x:xs) = x
head1 ⊥ = ⊥

head2 [] = ⊥
head2 (x:xs) = x
head2 ⊥ = ⊥

head是标准库版本。head'是 wikibook 中的版本。head1是交换了子句的版本。head2是第一个模式与[]. ⊥ 读作“底部”,表示非终止或异常计算,即undefined.

我所期望的是以下示例,其中可反驳和不可反驳的模式之间存在细微但显着的差异:

konst ~() = ()

konst' () = ()

partialId ~(x:xs) = x:xs

partialId' (x:xs) = x:xs
于 2016-03-02T01:45:13.330 回答