gpt4 book ai didi

haskell - Haskell wikibook 中无可辩驳/懒惰的模式练习

转载 作者:行者123 更新时间:2023-12-02 12:17:32 31 4
gpt4 key购买 nike

在这儿的一半...

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 的常规部分版本,尽管在空中存在不同的异常列出案例。在我看来,第二个问题的答案是“不”,但考虑到“如果是这样,如何”附录,感觉我也一定在这里遗漏了一些东西。谁能启发我吗?不幸的是,页面上的解决方案链接并未涵盖此练习。

最佳答案

我不确定维基百科上的“帮助”是什么意思。您是正确的,更改顺序将使其行为本质上与正常的 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 是第一个模式与 [] 的可反驳匹配的版本。 ⊥ 读作“bottom”,表示非终止或异常计算,即未定义

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

konst ~() = ()

konst' () = ()

partialId ~(x:xs) = x:xs

partialId' (x:xs) = x:xs

关于haskell - Haskell wikibook 中无可辩驳/懒惰的模式练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736535/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com